Periksa apakah string tidak kosong atau spasi dalam skrip shell


94

Saya mencoba menjalankan skrip shell berikut yang seharusnya memeriksa apakah string tidak spasi atau kosong. Namun, saya mendapatkan hasil yang sama untuk semua 3 string yang disebutkan. Saya telah mencoba menggunakan sintaks "[[" juga tetapi tidak berhasil.

Ini kode saya:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

Saya mendapatkan keluaran berikut:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

Apakah string kosong dikenal sebagai string null dalam skrip shell?
Josiah Yoder

Jawaban:


126

Anda membutuhkan ruang di kedua sisi !=. Ubah kode Anda menjadi:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

Terima kasih banyak, ini berhasil. Tapi saya bertanya-tanya mengapa tugas tidak menggunakan spasi sedangkan perbandingan menggunakan spasi.
Shubhanshu Mishra

5
^^ Ini sintaks. Kata pertama pada baris perintah adalah perintah & kata berikutnya adalah argumen. var=value [command [args]]adalah sintaks, di mana variabel diberi nilai. untuk perbandingan, [( /usr/bin/[) adalah perintah & itu membutuhkan var1,! = & var2 menjadi 3 argumen terpisah. var1! = var2 adalah argumen tunggal.
anishsane

64

Untuk memeriksa string kosong di shell

if [ "$str" == "" ];then
   echo NULL
fi

ATAU

if [ ! "$str" ];then
   echo NULL
fi

10
Operator persamaan string shell adalah =. Ini ==adalah peretasan non-portabel yang ditemukan oleh pembuat shell untuk mengacaukan pikiran programmer muda.
Jens

18

Jika Anda perlu memeriksa jumlah spasi apa pun, tidak hanya spasi tunggal, Anda dapat melakukan ini:

Untuk menghapus string spasi putih ekstra (juga mengondisikan spasi di tengah menjadi satu spasi):

trimmed=`echo -- $original`

The --memastikan bahwa jika $originalmengandung switch dipahami oleh gema, mereka masih akan dianggap sebagai argumen normal untuk bergema. Juga penting untuk tidak menempatkan ""sekitar $original, atau ruang tidak akan dihapus.

Setelah itu Anda bisa memeriksa apakah $trimmedkosong.

[ -z "$trimmed" ] && echo "empty!"

3
Di bourne shell saya berakhir dengan "-" sebagai nilai yang dipangkas.
Sridhar Sarnobat

Menurut posting ini , echo tidak menafsirkan - berarti akhir dari opsi. Di shell Bash saya, saya mendapatkan hasil yang sama dengan Sridhar Sarnobat
Mr.C

10

Tes cepat lainnya untuk string yang memiliki sesuatu di dalamnya selain spasi.

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" berarti string panjang bukan nol.

Maka rata-rata dua garis miring pertama cocok dengan semua yang berikut, dalam ruang kasus kita. Kemudian garis miring ketiga diikuti dengan string pengganti (kosong) dan ditutup dengan "}". Perhatikan perbedaan dari sintaks ekspresi reguler biasa.

Anda dapat membaca lebih lanjut tentang manipulasi string dalam skrip bash shell di sini .


tidak [[ -n "$1" ]]sama dengan [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills Anda benar, menggunakan -n akan membuatnya sedikit lebih pendek. Saya baru saja memperbarui jawabannya.
elomage

6

Untuk memeriksa apakah sebuah string kosong atau hanya berisi spasi, Anda dapat menggunakan:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

Lihat Perluasan Parameter Shell dan Pencocokan Pola di Bash Manual.


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

Menghapus semua baris dan spasi baru dari string akan menyebabkan yang kosong menjadi tidak ada yang dapat diuji dan ditindaklanjuti

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.