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
Jawaban:
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
sumber
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.Untuk memeriksa string kosong di shell
if [ "$str" == "" ];then echo NULL fi
ATAU
if [ ! "$str" ];then echo NULL fi
sumber
=
. Ini==
adalah peretasan non-portabel yang ditemukan oleh pembuat shell untuk mengacaukan pikiran programmer muda.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$original
mengandung 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
$trimmed
kosong.[ -z "$trimmed" ] && echo "empty!"
sumber
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 .
sumber
[[ -n "$1" ]]
sama dengan[[ ! -z "$1" "]]
?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.
sumber
[ $(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
sumber