Spacje w przypisaniach zmiennych w skryptach powłoki

17

Jaka jest różnica między przypisaniami poniżej zmiennych?

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

Czy jest jakaś różnica w przestrzeni wokół operatora przypisania?

ajay
źródło
W większości języków programowania nie miałoby to żadnego znaczenia ... Czy faktycznie jest jakaś różnica na początek? Mówisz też o oldschool sh? nie Ash / Zsh / Bash lub inne nowe rzeczy?
Cestarian
Tylko pierwsze przykłady ustawiają zmienną.
DisplayName
Czy więc ostatnie 3 nie zgłaszają błędu składniowego? czy rzeczywiście mają znaczenie?
Cestarian
2
@Cestarianin może coś znaczyć, jeśli masz wywoływane polecenie, varwówczas var =23przejdzie =23do var, a var = 23przejdzie =i 23var. Albo, jeśli masz polecenie nazywa var=następnie var= 23przejdzie 23do polecenia var=.
DisplayName
1
@Cestarian Zastąpiony przez bash, co robi dokładnie to samo, co shwe wszystkich czterech przypadkach.
pfnuesel

Odpowiedzi:

14

To bardzo zależy od powłoki. Jeśli spojrzymy tylko na 4 główne rodziny skorup (Bourne, csh, rc, fish):

Rodzina Bourne

To jest Bourne shell i wszystkie jego odmiany i ksh, bash, ash/ dash, zsh, yash.

  • var=23: to jest poprawna składnia przypisania zmiennych: słowo składające się z niecytowanych liter, cyfr lub znaków podkreślenia, po których następuje cudzysłow, =który pojawia się przed argumentem polecenia (tutaj jest sam)
  • var =23, varpolecenie z =23argumentem jako (z wyjątkiem zshgdzie gdzie =somethingjest specjalny operator, który rozwija się do ścieżki somethingpolecenia. W tym przypadku prawdopodobnie wystąpi błąd, ponieważ 23prawdopodobnie nie będzie to poprawna nazwa polecenia).
  • var= 23: przypisanie, var=po którym następuje nazwa polecenia 23. To ma być wykonane 23z var=przekazanym do jego środowiska ( varzmienna środowiskowa z pustą wartością).
  • var = 23, varkomenda z argumentem =i 23jako argument. Spróbuj echo = 23na przykład.

Rodzina Csh

csha tcsh. Istnieją przypisania zmiennych ze set var = valueskładnią dla zmiennych skalarnych, set var = (a b)tablic, setenv var valuezmiennych środowiskowych,@ var=1+1 dla przypisania i oceny arytmetycznej.

Więc:

  • var=23po prostu wywołuje var=23polecenie.
  • var =23wywołuje varpolecenie =23jako argument.
  • var= 23wywołuje var=polecenie 23jako argument
  • var = 23to powołując się na varkomendę =i 23jako argumenty.

Rodzina RC

To rc, esi akanga. W tych powłokach zmienne są tablicami, a przypisania są za pomocą var = (foo bar), przy var = fooczym skrót dla var = (foo)(tablica z jednym fooelementem) i var =skrót dla var = ()(tablica bez elementu, należy użyć var = ''dla tablicy z jednym pustym elementem).

W każdym razie puste miejsca (spacja lub tabulator) wokół =są dozwolone i opcjonalne. Więc w tych powłokach te 4 polecenia są równoważne i równoważne var = (23)do przypisania tablicy z jednym elementem 23.

Ryba

W fishskładnia przypisania zmiennej to set var value1 value2. Podobnie jak w rc, zmienne są tablicami.

Zachowanie byłoby więc takie samo jak w przypadku csh, ale fishnie pozwala na uruchomienie polecenia z =jego nazwą. Jeśli masz takie polecenie jest, trzeba powołać go poprzez shna przykład: sh -c 'exec weird===cmd'.

Więc wszystko var=23i var= 23daje błąd, var =23wywoła varkomendę =23jako argument i var = 23wywoła varkomendę =i 23jako argumenty.

Stéphane Chazelas
źródło
8

var=23przypisuje 23 do zmiennej var.

var =23próbuje uruchomić polecenie (lub alias lub funkcję) varz argumentem=23

var = 23to samo, ale argumenty =i23

var= 23ustawia varzmienną środowiskową na pusty ciąg, a następnie uruchamia polecenie23

Tak, shell jest dziwny jako język programowania. Ma to jednak sens jako powłoka do użytku interaktywnego, w którym spacje oddzielają polecenia i argumenty. Większość „znaków specjalnych” ( =w tym przypadku) ma specjalne znaczenie tylko w określonych pozycjach, aby umożliwić prawie dowolne argumenty poleceń. Patrz powyższe interpretacje.

vonbrand
źródło
3
  • var=23 to poprawna składnia do przypisywania wartości zmiennej.
  • var =23jest uważany za polecenie varz =23opcją / argumentem polecenia var(chociaż poprawna / standardowa składnia argumentu / opcji to -optionlub --option)
  • var= 23nie przydzieli niczego, varponieważ białe znaki przerywają proces przypisywania i 23będą traktowane jako kolejne polecenie. Obejściem tego problemu jest var=\ 23lub var=' 23'przechowywanie białych znaków.
  • var = 23ma podobny skutek jak omówiono w 2 ND przypadku.

    W rzeczywistości tego rodzaju wykorzystanie przestrzeni wokół =jest zwykle używane w warunkach testowych wewnątrz [[ ]]. Przykład dla 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).

A przecież zachowanie białej przestrzeni =zależy od powłoki i języków programowania.

Pandya
źródło