Подтяжки ( $var
vs. ${var}
)
В большинстве случаев, $var
и ${var}
то же самое:
var=foo
echo $var
# foo
echo ${var}
# foo
Скобки нужны только для устранения двусмысленности в выражениях:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Котировки ( $var
против "$var"
против "${var}"
)
Когда вы добавляете двойные кавычки вокруг переменной, вы указываете оболочке рассматривать ее как одно слово, даже если оно содержит пробелы:
var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
echo $i # so only runs the loop once
done
# foo bar
Сравните это поведение со следующим:
var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
echo $i # so runs the loop twice, once for each argument
done
# foo
# bar
Как и в случае с $var
vs. ${var}
, фигурные скобки нужны только для устранения неоднозначности, например:
var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
echo $i # variable named 'varbar', so loop runs once and
done # prints nothing (actually "")
var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
echo $i # so runs the loop once
done
# foo barbar
Обратите внимание , что "${var}bar"
во втором примере выше , также может быть написано "${var}"bar
, в этом случае вам не нужны брекеты больше, то есть "$var"bar
. Однако, если у вас много кавычек в вашей строке, эти альтернативные формы могут быть трудно читать (и, следовательно, их трудно поддерживать). Эта страница представляет собой хорошее введение в цитирование в Bash.
Массивы ( $var
против $var[@]
против ${var[@]}
)
Теперь о вашем массиве. Согласно руководству по bash :
Ссылка на переменную массива без нижнего индекса эквивалентна ссылке на массив с нижним индексом 0.
Другими словами, если вы не укажете индекс []
, вы получите первый элемент массива:
foo=(a b c)
echo $foo
# a
Это точно так же, как
foo=(a b c)
echo ${foo}
# a
Чтобы получить все элементы массива, вам нужно использовать @
в качестве индекса, например ${foo[@]}
. Фигурные скобки требуются с массивами, потому что без них оболочка $foo
сначала расширила бы часть, предоставив первый элемент массива, за которым следует литерал [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Эта страница - хорошее введение в массивы в Bash.
Повторение цитат ( ${foo[@]}
vs. "${foo[@]}"
)
Вы не спрашивали об этом, но это тонкая разница, о которой полезно знать. Если элементы в вашем массиве могут содержать пробелы, вам нужно использовать двойные кавычки, чтобы каждый элемент обрабатывался как отдельное «слово»:
foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
echo $i # so the loop runs twice
done
# the first
# the second
Сравните это с поведением без двойных кавычек:
foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
echo $i # so the loop runs four times!
done
# the
# first
# the
# second
bash
скрипте?