Ini berfungsi pada prompt shell (bash, dash):
[ -z "" ] && echo A || echo B
A
Namun, saya mencoba untuk menulis skrip shell POSIX , dimulai seperti ini:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
Dan saya tidak tahu mengapa, tetapi saya tidak mendapatkan pesannya :
Argumen yang diberikan kosong.
jika saya memanggil skrip seperti ini:
./test_empty_argument ""
Mengapa demikian?
shell-script
arguments
LinuxSecurityFreak
sumber
sumber
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
akan bekerja dengan baik; string kosong yang dikutip tidak akan dihapus dari daftar argumen[
. Tapi itu juga tidak perlu, karena[ -z "$var" ]
juga berfungsi dengan baik.Jawaban:
Perhatikan bahwa baris Anda
ini sama dengan
(
;
kaleng tanda kutip , dalam sebagian besar keadaan, digantikan oleh karakter baris baru)Ini berarti bahwa
exit 1
pernyataan selalu dieksekusi terlepas dari berapa banyak argumen yang diteruskan ke skrip. Ini pada gilirannya berarti bahwa pesanThe given argument is empty.
tersebut tidak akan pernah memiliki peluang untuk dicetak.Untuk menjalankan lebih dari satu pernyataan tunggal setelah pengujian menggunakan "sintaks hubung singkat", kelompokkan pernyataan di
{ ...; }
. Alternatifnya adalah dengan menggunakanif
pernyataan yang benar (yang, IMHO, terlihat lebih bersih dalam skrip):Anda memiliki masalah yang sama dengan tes kedua Anda.
Mengenai
Ini akan bekerja untuk contoh yang diberikan, tetapi generik
akan tidak sama dengan
Sebaliknya, itu lebih seperti
atau
Artinya, jika tes atau perintah pertama gagal, perintah kedua dijalankan, yang berarti memiliki potensi untuk mengeksekusi ketiga pernyataan yang terlibat.
sumber
Ini:
tidak:
Tetapi sebaliknya adalah:
Script Anda keluar terlepas dari berapa banyak argumen yang Anda berikan.
sumber
Salah satu cara untuk membuatnya lebih mudah dibaca adalah mendefinisikan
die
fungsi (à laperl
) seperti:Anda dapat menambahkan lebih banyak lonceng dan peluit seperti warna, awalan, nomor baris ... jika perlu.
sumber
die
fungsi Anda dengan beberapa argumen? (Jika demikian, dapatkah Anda memberi contoh?) Saya menggunakan fungsi yang hampir identikdie
, tetapi menggunakan"$*"
sebagai gantinya, yang mungkin lebih dari apa yang Anda inginkan?"$@"
adalah memungkinkan pesan multi-line tanpa perlu menambahkan baris baru secara literal."$*"
untuk bergabung dengan args dengan spasi juga berarti Anda perlu mengatur$IFS
ke SPC agar dapat bekerja di semua konteks termasuk yang$IFS
telah dimodifikasi. Atau denganksh
/zsh
, Anda dapat menggunakanprint -r -- "$@"
atauecho -E - "$@"
dalamzsh
.die
fungsi -type. Yang saya tanyakan adalah: dalam praktiknya, pernahkah Anda melihat seseorang menulisdie "unable to blah:" "some error"
, dengan tujuan mendapatkan pesan kesalahan 2-baris?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. Pernahkah Anda secara pribadi menggunakandie
fungsi semacam ini untukprintf
menghasilkan pesan kesalahan multi-line dengan melewati beberapa argumen? Atau apakah Anda hanya pernah mengirimkan argumen tunggaldie
sehingga hanya menambahkan satu baris baru ke outputnya?Saya sering melihat ini sebagai tes untuk string kosong:
sumber
-a
,-o
,(
dan)
sebagai derectives untuk memberitahutest
untuk menggabungkan beberapa operasi dalam doa tunggal dihindari; lihat penanda OB di pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
, dan pendahulu langsung Heirloom Bourne) juga tidak memilikinya.