Katakanlah kita memiliki 2 bilangan bulat dalam skrip bash:
value1=5
value2=3
Lalu mengapa kita perlu menggunakan tanda kutip ganda untuk ujian? Sebagai contoh:
if [[ "$value1" -eq "$value2" ]]
Mengapa tidak menggunakan saja yang berikut ini?
if [[ $value1 -eq $value2 ]]
Bagi saya, tanda kutip ganda tidak masuk akal.
5
dan3
, adalah rawatan. Nilai dapat berubah nanti, dan kesalahan yang dihasilkan mungkin tidak jelas.[[ ]]
, hanya untuk[ ]
.[[ ]]
mereka juga memaksa operan-eq
untuk integer.Jawaban:
Pemisahan kata.
Contoh ini sangat tidak mungkin, tetapi mungkin , jadi jika Anda ingin membuat kode secara defensif, tutupi trek Anda dengan tanda kutip:
OK, semua baik sejauh ini. Mari kita lemparkan kunci pas ke roda gigi:
Ups.
Ahh.
sumber
[[ ]]
konstruk bash .[ $value1 -eq $value2 ]
dengan yang kosongvalue1
akan'[' -eq 3 ']'
tanpa''
di sisi kiri.Anda sebenarnya tidak memerlukan tanda kutip di sini. Ini adalah salah satu dari sedikit kasus di mana aman untuk menggunakan variabel yang tidak dikutip. Anda dapat mengkonfirmasi ini dengan
set -x
:Seperti yang Anda lihat di atas, versi tes yang dikutip dan tidak dikutip diselesaikan dengan hal yang sama persis oleh bash. Hal yang sama harus berlaku untuk
zsh
dan, saya pikir, shell lain yang mendukung[[ ]]
operator.Perhatikan bahwa tidak demikian halnya dengan yang lebih portabel
[ ]
:The
[ ]
membangun, tidak seperti[[ ]]
satu, memang membutuhkan mengutip.Beberapa tautan bermanfaat untuk mempelajari lebih lanjut tentang kapan dan mengapa mengutip diperlukan:
sumber
declare -i var1=
adalah0
ketika dievaluasi.-eq
ini adalah perbandingan aritmatika , sehingga Anda bahkan dapat meninggalkan bagian$
luar (dalam[[ .. ]]
), dan menulis[[ a -eq b ]]
. Dengan perbandingan string, Anda perlu$
, tentu saja, jadi[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Jika Anda ingin menggunakan karakter glob tanpa aktingnya sebagai glob dalam konteks globbing (seperti[[ ]]
) maka Anda perlu mengutip, ya.((...))
atau$((...)
. Tampaknya bekerja, tetapi (orang tua yang pemarah, memungkinkan) saya tidak suka itu.-eq
dan teman-teman di dalam[[ ]]
konteks aritmatika juga. :) (Terkait: Perintah ekspansi variabel otomatis di dalam bash [[]] )Meskipun tanda kutip ganda tidak diperlukan, alasan untuk menggunakannya adalah:
value1
danvalue2
variabel, dan Anda mungkin tidak tahu apa isinya. Kalau tidak, Anda mungkin juga bertanya, "Mengapa repot-repot dengan variabel daripada memeriksaif [[ 5 -eq 3 ]]
? Atau mengambil lebih jauh, mengapa repot-repot denganif
sama sekali ketika Anda sudah tahu bahwa 5 tidak sama dengan 3? Sering kali lebih baik bersikap defensif. (Memang benar pemisahan kata tidak akan terjadi[[
, tetapi kasus di mana pemisahan kata tidak terjadi jarang terjadi. Sekali lagi, lihat poin pertama.)sumber
Tidak terkait langsung dengan pertanyaan Anda, tetapi saya gunakan
ketika saya membandingkan angka tetapi di sana Anda juga tidak perlu menggunakan tanda kutip.
sumber
if (( value1 == value2 )); then
. Dalam konteks aritmatika, Anda bahkan tidak memerlukannya$
. Namun, pertanyaan ini tampaknya berfokus pada variabel yang digunakan dalam[[ ... ]]
tes.Anda benar sekali!
Mengutip dalam kurung kotak ganda tidak masuk akal sama sekali, setidaknya dalam kasus ini.
Tapi karena saya menggunakan tanda kutip ganda setiap hari - terutama untuk ekspresi kurung siku tunggal, menyampaikan argumen ke fungsi dan skrip, serta kadang-kadang penugasan variabel (yang sama sekali tidak berguna untuk delcarations sederhana) - Saya kira beberapa orang, setidaknya saya lakukan, menulis tanda kutip ganda di sekitar ekspansi variabel secara naluriah .
Manfaat melakukan double quote secara konsekuen dan komprehensif - tetapi hanya jika masuk akal - adalah bahwa rekan kerja yang baru mengenal bash dapat belajar bagaimana menulis skrip yang lebih stabil . Ini juga menekankan fakta bahwa seni pemrosesan data dengan bash lebih tentang memisahkan aliran data (termasuk variabel) dengan pemisah lapangan dan menyalurkannya melalui filter . Segera setelah Anda memisahkan data dari aliran, pegang bersama dengan tanda kutip ganda!
Manfaat lain bisa berupa keterbacaan skrip bash yang lebih baik dengan string yang dikutip ganda dalam editor penyorot kode .
sumber