misalnya
if [ "$FOO" = "true" ]; then
vs.
if [ $FOO = "true" ]; then
Apa bedanya? Sepertinya kedua pernyataan itu juga berfungsi.
bash
shell
shell-script
quoting
Ryan
sumber
sumber
a='foo bar'; [[ $a == "foo bar" ]]
. Namun, variabel yang tidak mengandung karakter gumpal tidak perlu:[[ $a == $a ]]
. Ekspansi kata tidak dilakukan di dalam tanda kurung ganda. Dan untuk pencocokan regex, pola di sisi kanan tidak boleh dikutip atau akan diambil sebagai string literal:[[ $a =~ .*oo.*r ]]
(polanya harus dalam variabel yang tidak dikutip, namun ...[[ $a == foo* ]]
. Bisakah Anda memberikan contoh tambahan dari persyaratan untuk mengutip selain contoh string literal saya?Jawaban:
Jika nilai
$FOO
adalah kata tunggal yang tidak mengandung karakter wildcard\[*?
, maka keduanya identik.Jika
$FOO
tidak ditetapkan, atau kosong, atau lebih dari satu kata (yaitu, berisi spasi atau$IFS
), maka versi yang tidak dikutip adalah kesalahan sintaksis. Jika kebetulan urutan kata-kata yang tepat (seperti0 -eq 0 -o false
), hasilnya bisa sewenang-wenang. Oleh karena itu, praktik yang baik untuk selalu mengutip variabel dalam skrip shell.Kebetulan,
"true"
tidak perlu dikutip.sumber
Untuk mengilustrasikan masalah apa yang mungkin ditimbulkannya, berikut beberapa contoh.
Katakanlah kita memiliki dua variabel sebagai berikut:
Sekarang kita memiliki dua variabel yang memiliki string / nilai yang sama persis. Jika kami melakukan beberapa pernyataan if untuk menguji hasilnya, dalam kasus Anda:
Pada titik ini Anda akan dapatkan
bash: [: too many arguments
. $ FOO yang tidak dikutip memegang sekarang tiga nilai, yaitu'[ , some , value'
.[
kata kunci uji tidak tahu apa yang harus dieksekusi karena mengharapkan argumen pertama atau kedua untuk menjadi operator.Ketika kami mengutip "$ FOO", kami secara eksplisit meminta
if
untuk melihat nilai yang tepat di mana tidak ada pemisahan kata.Contoh lain:
rm $my_file
berarti menghapus 'A' 'acak' 'file.txt' yang menjadikannya tiga file.rm "$my_file"
akan menghapus "file.txt acak" yang membuat satu file.Semoga saya tidak membingungkan Anda dengan contoh-contoh ini.
sumber
Dalam kasus khusus ini tidak ada perbedaan.
Namun, jika
$FOO
berisi spasi atau beberapa karakter khusus, Anda akan memiliki masalah.Dalam hal
"$FOO"
ini, ia akan menggunakan variabel secara total, untuk membuat kecocokan mengisolasi Anda dari masalah ruang.Namun, jika Anda menggunakan
$FOO
dan ada kasus khusus itu akan mempengaruhi pernyataan if.sumber