Pojedynczy nawias w przypisywaniu zmiennych bash

11

Zastanawiałem się nad pojedynczymi nawiasami w bash. Wiem, że są one używane do wykonywania poleceń w podpowłokach i że są używane do tworzenia tablic, ale czy są one używane do czegokolwiek innego?

Jedną z rzeczy, które zwróciły moją uwagę, jest to, że kiedy używasz przypisania zmiennej, np

var=(hello)
echo $var    # hello

bash nie generuje błędu ani nic, a wynik jest taki sam, jak gdyby

var=hello

Czy te dwie definicje zmiennych są takie same czy istnieje różnica?

Mattias
źródło

Odpowiedzi:

14

W twoim przypadku (), na przykład, używane są nawiasy jako definicja tablicy

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

Jeśli umieścisz pojedynczą zmienną w tablicy, to po prostu masz tablicę z pojedynczym elementem.


Aby odpowiedzieć na inne pytanie, czy nawiasy są również używane do czegokolwiek innego: istnieje wiele sytuacji, w bashktórych w połączeniu z innymi znakami można ich użyć jako:

  • podstawienie polecenia: $()
  • proces podstawienia: <()i>()
  • podpowłoka: (command)
  • ocena arytmetyczna: (())
  • definicja funkcji: fun () { echo x; }
  • lista wzór w glob: ?(), *(), +(), @(), !()( tylko jeśli extglobjest włączone )
jimmij
źródło
1
Racja, właściwie o tym nie myślałem. Ale tak var=(1 2 3); echo $varsamo jak var=(1 2 3); echo ${var[0]}?
Mattias,
Tak, wynik bashjest taki sam.
jimmij
Czy musimy ""się echo "${a}"?
nn0p
@ nn0p Tak, robimy, jeśli nie chcemy wykonywać operacji dzielenia i globowania a. Rozważ na przykład a=*, a następnie spróbuj echo $ai echo "$a".
jimmij