Szelki ( $var
vs. ${var}
)
W większości przypadków $var
i ${var}
są takie same:
var=foo
echo $var
echo ${var}
Nawiasy klamrowe są potrzebne tylko do rozwiązania niejednoznaczności w wyrażeniach:
var=foo
echo $varbar
echo ${var}bar
Cytaty ( $var
porównaniu "$var"
vs. "${var}"
)
Kiedy dodajesz podwójne cudzysłowy wokół zmiennej, mówisz powłoce, aby traktowała ją jako pojedyncze słowo, nawet jeśli zawiera spacje:
var="foo bar"
for i in "$var"; do
echo $i
done
Porównaj to zachowanie z następującymi:
var="foo bar"
for i in $var; do
echo $i
done
Podobnie jak w przypadku $var
vs. ${var}
, szelki są potrzebne tylko do ujednoznacznienia, na przykład:
var="foo bar"
for i in "$varbar"; do
echo $i
done
var="foo bar"
for i in "${var}bar"; do
echo $i
done
Zwróć uwagę, że "${var}bar"
w drugim przykładzie powyżej można również zapisać "${var}"bar
, w którym to przypadku nie potrzebujesz już nawiasów klamrowych, tj "$var"bar
. Jeśli jednak masz dużo cudzysłowów w swoim ciągu, te alternatywne formy mogą być trudne do odczytania (a zatem trudne w utrzymaniu). Ta strona stanowi dobre wprowadzenie do cytowania w Bash.
Tablicami ( $var
porównaniu $var[@]
vs. ${var[@]}
)
Teraz twoja tablica. Zgodnie z instrukcją bash :
Odwołanie się do zmiennej tablicowej bez indeksu jest równoważne odwołaniu się do tablicy z indeksem dolnym równym 0.
Innymi słowy, jeśli nie podasz indeksu []
, otrzymasz pierwszy element tablicy:
foo=(a b c)
echo $foo
Co jest dokładnie tym samym, co
foo=(a b c)
echo ${foo}
Aby pobrać wszystkie elementy tablicy, @
jako indeksu należy użyć np ${foo[@]}
. Nawiasy klamrowe są wymagane przy tablicach, ponieważ bez nich powłoka najpierw rozszerzyłaby $foo
część, podając pierwszy element tablicy, a po nim literał [@]
:
foo=(a b c)
echo ${foo[@]}
echo $foo[@]
Ta strona jest dobrym wprowadzeniem do tablic w Bash.
Cytaty ponownie odwiedzone ( ${foo[@]}
vs. "${foo[@]}"
)
Nie pytałeś o to, ale jest to subtelna różnica, o której warto wiedzieć. Jeśli elementy Twojej tablicy mogą zawierać spacje, musisz użyć podwójnych cudzysłowów, aby każdy element był traktowany jako osobne „słowo:”
foo=("the first" "the second")
for i in "${foo[@]}"; do
echo $i
done
Porównaj to z zachowaniem bez podwójnych cudzysłowów:
foo=("the first" "the second")
for i in ${foo[@]}; do
echo $i
done
bash
skrypcie?