Пробіли у змінних призначеннях у скриптах оболонки


17

Яка різниця між присвоєннями змінних нижче?

var=23
var =23
var= 23
var = 23

Чи є різниця в просторі навколо оператора призначення?


У більшості мов програмування це взагалі не має значення ... Чи є насправді різниця для початку? Ви також тут говорите Oldschool sh? не ash / zsh / bash чи інші нові речі?
Cestarian

Лише перші приклади встановлюють змінну.
DisplayName

Тоді хіба останні 3 просто не видають синтаксичну помилку? чи вони насправді мають значення?
Cestarian

2
@ Cestarian вони можуть щось означати, якщо у вас є команда, яка називається, varтоді var =23було б передати =23var, а var = 23передати =і 23var. Або, якщо у вас є команда, яка називається, var=тоді var= 23вона перейде 23до команди var=.
DisplayName

1
@Cestarian Замінено на bash, що робить точно те саме, що і shу всіх чотирьох випадках.
pfnuesel

Відповіді:


14

Це дуже залежить від оболонки. Якщо ми розглянемо лише 4 основні сімейства оболонок (Bourne, csh, rc, fish):

Сім'я Борна

Це Bourne оболонки і все його варіанти і ksh, bash, ash/ dash, zsh, yash.

  • var=23: це правильний синтаксис присвоєння змінної: слово, яке складається з цитованих букв, цифр або підкреслень, за якими слідує котирування, =яке з’являється перед аргументом команди (тут воно самостійно)
  • var =23, varкоманда з =23аргументом (за винятком випадків, zshколи =somethingє спеціальний оператор, який розширюється на шлях somethingкоманди. Тут ви, ймовірно, отримаєте помилку, оскільки 23це навряд чи буде правильним ім'ям команди).
  • var= 23: призначення, яке var=супроводжується ім'ям команди 23. Це призначено для виконання 23з var=переданим у його середовище ( varзмінною середовища з порожнім значенням).
  • var = 23, varкоманда з аргументом =і 23як. Спробуйте, echo = 23наприклад.

Csh родина

cshі tcsh. Існують змінні призначення з set var = valueсинтаксисом для скалярних змінних, set var = (a b)для масивів, setenv var valueдля змінних середовища, @ var=1+1для призначення та арифметичної оцінки.

Так:

  • var=23це лише виклик var=23команди.
  • var =23викликає varкоманду в =23якості аргументу.
  • var= 23викликає var=команду в 23якості аргументу
  • var = 23викликає varкоманду з аргументами =та 23як.

Rc сім'ї

Ось rc, esі akanga. У цих оболонках змінні - це масиви, а присвоєння мають var = (foo bar), з var = fooкороткими для var = (foo)(масив з одним fooелементом) та var =короткими для var = ()(масив без елемента, використовувати var = ''для масиву з одним порожнім елементом).

У будь-якому випадку, пробіли (пробіл чи вкладка) навколо =дозволені та необов’язкові. Тож у цих оболонках ці 4 команди є рівнозначними та еквівалентними var = (23)для призначення масиву з одним елементом 23.

Риба

В fish, синтаксис призначення змінної є set var value1 value2. Як і в rc, змінні - це масиви.

Таким чином, поведінка буде такою ж, як і у випадку csh, за винятком того fish, що не дозволить вам запустити команду з а =в її імені. Якщо у вас є така команда є, вам потрібно викликати його з допомогою sh, наприклад: sh -c 'exec weird===cmd'.

Так що всі var=23і var= 23дадуть вам помилку, var =23викличуть varкоманду з =23аргументом і var = 23будуть називати varкоманду аргументами =і 23як.


8

var=23призначає 23 змінної var.

var =23намагається запустити команду (або псевдонім, або функцію) varз аргументом=23

var = 23ditto, але аргументи =і23

var= 23встановлює varзмінну середовища в порожній рядок, після чого виконує команду23

Так, оболонка дивна як мова програмування. Але це має ідеальний сенс як оболонка для інтерактивного використання, де пробіли розділяють команди та аргументи. Більшість "спеціальних символів" ( =в даному випадку) мають особливе значення лише в окремих положеннях, щоб дозволити майже довільні аргументи командам.


3
  • var=23 - правильний синтаксис для присвоєння значення змінній.
  • var =23розглядається як команда varз =23параметром / аргументом для команди var(Хоча правильний / стандартний синтаксис для аргументу / параметра є -optionабо --option)
  • var= 23не призначає нічого, varоскільки пробіл порушує процес призначення і 23буде розглядатися як інша команда. Вирішення проблеми var=\ 23або var=' 23'для зберігання пробілів.
  • var = 23має аналогічну дію, як обговорювалося у другому випадку.

    Насправді цей тип використання простору =зазвичай використовується для тестування стану всередині [[ ]]. Приклад для Bash:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

І все-таки поведінка пробілу навколо =залежить від вашої оболонки та мов програмування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.