Leerzeichen in Variablenzuweisungen in Shell-Skripten

17

Was ist der Unterschied zwischen den unten angegebenen Variablenzuordnungen?

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

Gibt es einen Unterschied im Raum um den Zuweisungsoperator?

ajay
quelle
In den meisten Programmiersprachen würde dies überhaupt keinen Unterschied machen. Auch du redest hier von oldschool sh? nicht ash / zsh / bash oder andere neue sachen?
Cestarian
Nur die ersten Beispiele legen eine Variable fest.
Anzeigename
Dann werfen die letzten 3 nicht einfach einen Syntaxfehler? Oder haben sie tatsächlich eine Bedeutung?
Cestarian
2
@Cestarian sie können etwas bedeuten, wenn Sie einen Befehl aufgerufen haben, vardann var =23würde =23an var übergeben werden, und var = 23würde =und 23an var übergeben. Oder, wenn Sie rief einen Befehl haben var=dann var= 23passieren würde 23auf den Befehl var=.
Anzeigename
1
@Cestarian Ersetzt durch bash, was genau dasselbe macht wie shin allen vier Fällen.
Pfnuesel

Antworten:

14

Das hängt sehr von der Schale ab. Wenn wir uns nur die 4 Hauptschalenfamilien (Bourne, csh, rc, fish) ansehen:

Bourne Familie

Das ist die Bourne - Shell und alle seine Varianten und ksh, bash, ash/ dash, zsh, yash.

  • var=23: das ist die korrekte Syntax für die Variablenzuweisung: ein Wort, das aus nicht zitierten Buchstaben, Ziffern oder Unterstrichen besteht, gefolgt von einem nicht zitierten Wort, =das vor einem Befehlsargument steht (hier ist es für sich allein)
  • var =23, der varBefehl mit =23dem Argument as (außer zshwenn =somethinges sich um einen speziellen Operator handelt, der auf den Pfad des somethingBefehls erweitert wird. Hier wird wahrscheinlich ein Fehler angezeigt, da 23es sich wahrscheinlich nicht um einen gültigen Befehlsnamen handelt).
  • var= 23: eine Zuweisung, var=gefolgt von einem Befehlsnamen 23. Das soll 23mit var=übergeben an seine Umgebung ( varUmgebungsvariable mit einem leeren Wert) ausgeführt werden.
  • var = 23, varGebiete mit =und 23als Argument. Versuchen Sie es echo = 23zum Beispiel mit.

Csh Familie

cshund tcsh. Variablenzuweisungen gibt es mit der set var = valueSyntax für skalare Variablen, set var = (a b)für Arrays, setenv var valuefür Umgebungsvariablen, @ var=1+1für Zuweisungen und für die arithmetische Auswertung.

So:

  • var=23ruft nur den var=23Befehl auf.
  • var =23ruft den varBefehl mit =23als Argument auf.
  • var= 23ruft den var=Befehl mit 23als Argument auf
  • var = 23ruft den varBefehl mit =und 23als Argumente auf.

RC Familie

Das ist rc, esund akanga. In diesen Shells sind Variablen Arrays und Zuweisungen sind mit var = (foo bar), wobei var = foosie kurz für var = (foo)(ein Array mit einem fooElement) und var =kurz für var = ()(Array ohne Element, Verwendung var = ''für ein Array mit einem leeren Element) sind.

In jedem Fall sind Leerzeichen (Leerzeichen oder Tabulatoren) =zulässig und optional. In diesen Shells sind diese 4 Befehle äquivalent und äquivalent var = (23), um ein Array mit einem Element zuzuweisen 23.

Fisch

In fishist die Variablenzuweisungssyntax set var value1 value2. rcVariablen sind wie in Arrays.

Das Verhalten ist also dasselbe wie bei csh, mit der Ausnahme, dass fishSie keinen Befehl mit einem =im Namen ausführen können . Wenn Sie ein solcher Befehl haben, müssen Sie es über aufrufen shzum Beispiel: sh -c 'exec weird===cmd'.

Also alle var=23und var= 23geben Ihnen einen Fehler, var =23rufen den varBefehl mit =23als Argument auf und var = 23rufen den varBefehl mit =und 23als Argument auf.

Stéphane Chazelas
quelle
8

var=23weist der Variablen 23 zu var.

var =23versucht, Befehl (oder Alias ​​oder Funktion) varmit Argument auszuführen=23

var = 23ebenso aber Argumente =und23

var= 23Setzt die varUmgebungsvariable auf eine leere Zeichenfolge und führt dann den Befehl aus23

Ja, Shell ist als Programmiersprache komisch. Aber es ist perfekt als Shell für die interaktive Verwendung, bei der Leerzeichen Befehle und Argumente trennen. Die meisten "Sonderzeichen" ( =in diesem Fall) haben nur an bestimmten Stellen eine besondere Bedeutung, um den Befehlen fast beliebige Argumente zu geben. Siehe obige Interpretationen.

vonbrand
quelle
3
  • var=23 ist die korrekte Syntax zum Zuweisen von Werten zu einer Variablen.
  • var =23wird als Befehl varmit =23Option / Argument für Befehl betrachtet var(obwohl korrekte / Standardsyntax für Argument / Option -optionoder ist --option)
  • var= 23will weist nichts zu, varda Leerzeichen den Zuweisungsprozess unterbrechen und 23als ein weiterer Befehl betrachtet werden. Die Problemumgehung ist var=\ 23oder var=' 23'zum Speichern von Leerraum.
  • var = 23hat einen ähnlichen Effekt wie im zweiten Fall.

    Tatsächlich wird diese Art der Nutzung des umliegenden Raums =normalerweise im Testzustand verwendet [[ ]]. Beispiel für 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).

Und schließlich =hängt das Verhalten des Leerraums von Ihrer Shell und den Programmiersprachen ab.

Pandya
quelle