Szelki ( $varvs. ${var})
W większości przypadków $vari ${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 ( $varporó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 $varvs. ${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 ( $varporó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 $fooczęść, 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
bashskrypcie?