Kawat gigi ( $var
vs ${var}
)
Dalam kebanyakan kasus, $var
dan ${var}
sama:
var=foo
echo $var
# foo
echo ${var}
# foo
Kawat gigi hanya diperlukan untuk menyelesaikan ambiguitas dalam ekspresi:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
Kutipan ( $var
vs "$var"
vs. "${var}"
)
Saat Anda menambahkan tanda kutip ganda di sekitar variabel, Anda memberi tahu shell untuk memperlakukannya sebagai satu kata, bahkan jika itu berisi spasi putih:
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
Bandingkan perilaku itu dengan yang berikut:
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
Seperti halnya $var
vs ${var}
, kawat gigi hanya diperlukan untuk disambiguasi, misalnya:
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
Perhatikan bahwa "${var}bar"
dalam contoh kedua di atas juga dapat ditulis "${var}"bar
, dalam hal ini Anda tidak perlu kawat gigi lagi, yaitu "$var"bar
. Namun, jika Anda memiliki banyak kutipan di string Anda, bentuk-bentuk alternatif ini bisa sulit dibaca (dan karenanya sulit dipertahankan). Halaman ini memberikan pengantar yang bagus untuk mengutip dalam Bash.
Array ( $var
vs $var[@]
vs. ${var[@]}
)
Sekarang untuk array Anda. Menurut manual bash :
Merujuk variabel array tanpa subskrip sama dengan mereferensikan array dengan subskrip 0.
Dengan kata lain, jika Anda tidak menyediakan indeks []
, Anda mendapatkan elemen pertama dari array:
foo=(a b c)
echo $foo
# a
Yang persis sama dengan
foo=(a b c)
echo ${foo}
# a
Untuk mendapatkan semua elemen array, Anda perlu menggunakan @
sebagai indeks, misalnya ${foo[@]}
. Kawat gigi diperlukan dengan array karena tanpa mereka, shell akan memperluas $foo
bagian pertama, memberikan elemen pertama array diikuti oleh literal [@]
:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
Halaman ini adalah pengantar yang bagus untuk array di Bash.
Kutipan ditinjau kembali ( ${foo[@]}
vs. "${foo[@]}"
)
Anda tidak bertanya tentang ini, tetapi itu adalah perbedaan halus yang perlu diketahui. Jika elemen dalam array Anda bisa berisi spasi putih, Anda perlu menggunakan tanda kutip ganda sehingga setiap elemen diperlakukan sebagai "kata:" yang terpisah.
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
Bandingkan ini dengan perilaku tanpa tanda kutip ganda:
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
skrip?