Einzelne Klammern in der Bash-Variablenzuweisung


11

Ich habe mich über einzelne Klammern in Bash gewundert. Ich weiß, dass sie zum Ausführen von Befehlen in Subshells und zum Erstellen von Arrays verwendet werden, aber werden sie für andere Zwecke verwendet?

Eine Sache, die meine Aufmerksamkeit auf sich gezogen hat, ist die, wenn Sie die in Variablenzuweisung verwenden, wie z

var=(hello)
echo $var    # hello

bash erzeugt keinen Fehler oder irgendetwas und die Ausgabe ist die gleiche wie wenn

var=hello

Sind diese beiden Variablendefinitionen gleich oder gibt es einen Unterschied?

Antworten:


14

In Ihrem Fall ()werden beispielsweise Klammern als Array-Definition verwendet

a=(one two three)   # array definition
echo "${a}"         # print first element of array a
echo "${a[0]}"      # print first element of array a
echo "${a[1]}"      # print *second* element of array a
echo "${#a[@]}"     # print number of elements in array a

Wenn Sie eine einzelne Variable in ein Array einfügen, haben Sie nur ein Array mit einem einzelnen Element.


Um Ihre andere Frage zu beantworten, ob Klammern auch für andere Zwecke verwendet werden: Es gibt viele Situationen, in bashdenen sie in Kombination mit anderen Zeichen verwendet werden können als:

  • Befehlsersetzung: $()
  • Prozesssubstitution: <()und>()
  • Unterschale: (command)
  • arithmetische Auswertung: (())
  • Funktionsdefinition: fun () { echo x; }
  • Musterliste in glob: ?(), *(), +(), @(), !()( nur wenn extglobEnable )

1
Richtig, daran habe ich eigentlich nicht gedacht. Aber so var=(1 2 3); echo $varist das gleiche wie var=(1 2 3); echo ${var[0]}?
Mattias

Ja, das Ergebnis bashist das gleiche.
Jimmyij

Brauchen wir ""in echo "${a}"?
nn0p

@ nn0p Ja, wenn wir keine Split- und Glob-Operation ausführen möchten a. Betrachten Sie zum Beispiel a=*, dann versuchen Sie echo $aund echo "$a".
Jimmyij
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.