Anda selalu memerlukan tanda kutip di sekitar variabel dalam semua konteks daftar , di mana-mana variabel tersebut dapat diperluas ke beberapa nilai kecuali Anda memang menginginkan 3 efek samping dari meninggalkan variabel yang tidak dikutip.
Daftar konteks termasuk argumen untuk perintah sederhana seperti [
atau echo
, yang for i in <here>
, tugas untuk array ... Ada konteks lain di mana variabel juga perlu dikutip. Yang terbaik adalah selalu mengutip variabel kecuali Anda punya alasan yang sangat bagus untuk tidak melakukannya.
Pikirkan tentang tidak adanya tanda kutip (dalam konteks daftar) sebagai operator split + glob .
Seolah-olah echo $test
itu echo glob(split("$test"))
.
Perilaku shell membingungkan bagi kebanyakan orang karena di sebagian besar bahasa lain, Anda menempatkan tanda kutip di sekitar string tetap, seperti puts("foo")
, dan tidak di sekitar variabel (seperti puts(var)
) sementara di shell itu sebaliknya: semuanya adalah string dalam shell, jadi menempatkan tanda kutip di sekitar segalanya akan merepotkan, Anda echo test
, Anda tidak perlu "echo" "test"
. Dalam shell, kutipan digunakan untuk hal lain: mencegah beberapa makna khusus dari beberapa karakter dan / atau mempengaruhi perilaku beberapa ekspansi.
Di [ -n $test ]
atauecho $test
, shell akan membagi $test
(kosong pada secara default), dan kemudian melakukan pembuatan nama file (perluas semua *
, '?' ... pola ke daftar file yang cocok), dan kemudian meneruskan daftar argumen itu ke [
atau echo
perintah .
Sekali lagi, anggap itu sebagai "[" "-n" glob(split("$test")) "]"
. Jika $test
kosong atau hanya berisi kosong (spc, tab, nl), maka operator split + glob akan mengembalikan daftar kosong, sehingga [ -n $test ]
akan menjadi "[" "-n" "]"
, yang merupakan tes untuk memeriksa apakah "-n" adalah string kosong atau tidak. Tetapi bayangkan apa yang akan terjadi jika $test
"*" atau "= foo" ...
Dalam [ -n "$test" ]
, [
disahkan empat argumen"["
, "-n"
, ""
dan "]"
(tanpa tanda kutip), yang adalah apa yang kita inginkan.
Apakah itu echo
atau [
tidak ada bedanya, hanya saja echo
menghasilkan hal yang sama apakah itu melewati argumen kosong atau tidak sama sekali.
Lihat juga jawaban ini untuk pertanyaan serupa untuk perincian lebih lanjut tentang [
perintah dan [[...]]
konstruk.
echo
, spasi tambahan dan baris baru akan dihapus.