Dalam skrip Bash shell, apa perbedaan (jika ada) antara dua pernyataan berikut?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
Saya menemukan diri saya menulis yang kedua dalam beberapa skrip, tetapi kemudian saya baca di sini bahwa menggunakan -z
mencapai hal yang sama.
Jika ada masalah menggunakan yang kedua, haruskah kita mengabaikan bahwa yang pertama terlihat sedikit lebih baik?
bash
shell-script
Johan
sumber
sumber
Jawaban:
[ "$1" = "" ]
dan[ -z "$1" ]
persis sama dalam bash dan shell yang sesuai dengan POSIX lainnya. (Perhatikan bahwa harus ada spasi di setiap sisi tanda kurung, kecuali jika ada karakter konstituen non-kata suka;
.)[
adalah shell built-in seperti yang lain; bahkan bisa juga diejatest
(satu-satunya perbedaan antara keduanya adalah yang[
membutuhkan]
argumen terakhir). Jadi, jika Anda menjalankan[ "$1" = "" ]
dengan$1
memperluas ke-z
, operator uji melihat tiga argumen:-z
,=
dan string kosong. Beberapa cangkang Bourne yang lebih tua kadang-kadang menimbulkan kesalahan parse ketika sebuah operan tampak seperti operator dengan cara ini, bahkan jika tidak ada ambiguitas dalam ekspresi lengkap. Saya tidak tahu apakah ada versi yang benar-benar memiliki masalah dengan ungkapan khusus ini, tetapi ekspresi yang lebih kompleks dapat membuangnya. Mungkin juga ada versi yang bermasalah dengan kata-kata kosong; ini juga tidak akan mendukung[ -z "$1" ]
. Idiom shell yang umum adalah[ x"$1" = x"" ]
. Ini menghindari risiko memiliki operan diurai sebagai operator karena tidak ada operator yang memulai dengan surat.Di ksh, bash dan zsh, Anda dapat menggunakan sintaks braket ganda
[[ -z $1 ]]
,. Sintaks yang lebih baru ini (berasal dari akhir 1980-an daripada pertengahan 1970-an) menghilangkan risiko memiliki operan diurai sebagai operator dengan menggunakan konstruksi sintaksis khusus daripada built-in biasa. Operator harus muncul secara harfiah, tidak dikutip dalam kurung ganda, dan Anda tidak perlu menggandakan ekspansi variabel penawaran.sumber