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
Shubhanshu Mishra
sumber
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
dogbane
sumber
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
RajeshKashyap
sumber
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!"
hyde
sumber
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 .

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

Eugene Yarmash
sumber
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

Shandilya yang keras
sumber