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?

Johan
sumber
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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Memperbaiki kesalahan ketik dengan ruang yang hilang di sebelah braket.
Johan