Дужки ( $var
проти ${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
порівнянні з ${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[@]
vs. ${var[@]}
)
Тепер для вашого масиву. Відповідно до посібника з bash :
Посилання на змінну масиву без індексів еквівалентно посиланню масиву на індекс.
Іншими словами, якщо ви не постачаєте індекс []
, ви отримуєте перший елемент масиву:
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[@]}
проти "${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
сценарії?