Di Bash, apakah jika [-z “$ 1”] dan jika [“$ 1” = “”] sama?


28

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 -zmencapai hal yang sama.

Jika ada masalah menggunakan yang kedua, haruskah kita mengabaikan bahwa yang pertama terlihat sedikit lebih baik?


3
Untuk perbandingan terperinci, lihat jawaban saya di Stack Overflow. Juga, lihat ini dan ini .
— Dijeda sampai pemberitahuan lebih lanjut.

tautan yang bagus, dengan beberapa jawaban yang bagus :)
— Johan

Jawaban:


36

[ "$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 dieja test(satu-satunya perbedaan antara keduanya adalah yang [membutuhkan ]argumen terakhir). Jadi, jika Anda menjalankan [ "$1" = "" ]dengan $1memperluas 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.


Memperbaiki kesalahan ketik dengan ruang yang hilang di sebelah braket.
— Johan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.