Kabuk betiğinde dizenin boş veya boşluk olmadığını kontrol edin


94

Bir dizenin boşluk veya boş olup olmadığını kontrol etmesi gereken aşağıdaki kabuk komut dosyasını çalıştırmaya çalışıyorum. Ancak, belirtilen tüm 3 dizeler için aynı çıktıyı alıyorum. Ben de "[[" sözdizimini kullanmayı denedim ama boşuna.

İşte kodum:

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

Aşağıdaki çıktıyı alıyorum:

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

Boş dizeler kabuk komut dosyasında boş dizeler olarak bilinir mi?
Josiah Yoder

Yanıtlar:


126

Her iki tarafında da bir boşluğa ihtiyacınız var !=. Kodunuzu şu şekilde değiştirin:

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

Çok teşekkürler, işe yarıyor. Ancak, karşılaştırma yaparken neden ödevin boşluk kullanmadığını merak ediyorum.
Shubhanshu Mishra

5
^^ Sözdizimi. Komut satırındaki ilk kelime komuttur ve sonrakiler argümanlardır. var=value [command [args]]bir değişkene değer atanan sözdizimidir. karşılaştırma için, [( /usr/bin/[) komuttur ve var1,! = & var2'nin 3 ayrı argüman olmasını gerektirir. var1! = var2 tek bir bağımsız değişkendir.
anishsane

64

Kabuktaki boş dizeyi kontrol etmek için

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

VEYA

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

10
Kabuğun dizgi eşitliği operatörü =. ==Genç programcılar kafasında kadar karışıklık kabuk yazarları tarafından icat olmayan bir taşınabilir kesmek olduğunu.
Jens

18

Yalnızca tek bir boşluğu değil, herhangi bir miktarda beyaz boşluğu kontrol etmeniz gerekirse, bunu yapabilirsiniz:

Ekstra beyaz boşluk dizesini çıkarmak için (ayrıca ortadaki beyaz boşluğu bir boşluk olarak yoğunlaştırır):

trimmed=`echo -- $original`

--Eğer sağlar $originalyankı tarafından anlaşılır anahtarları içeren, hala normal bir argüman olarak kabul edeceğiz yankılandı edilecek. Ayrıca ""etrafta dolaşmamak önemlidir $original, yoksa boşluklar kaldırılmayacaktır.

Bundan sonra $trimmedboş olup olmadığını kontrol edebilirsiniz .

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

3
Burne kabukta kırpılan değer olarak "-" ile biterim.
Sridhar Sarnobat

Bu gönderiye göre , yankı yorumlamaz - seçeneklerin sonu anlamına gelir. Bash kabuğumda Sridhar Sarnobat ile aynı sonucu alıyorum
Bay C

10

Bir dizgede boşluktan başka bir şey olması için başka bir hızlı test.

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

"-n", sıfır olmayan uzunlukta dize anlamına gelir.

O zaman ilk iki eğik çizgi , bizim durumumuzda / alanlarımızda aşağıdakilerin tümüyle eşleştiği anlamına gelir . Daha sonra üçüncü eğik çizginin ardından ikame (boş) dizesi gelir ve "}" ile kapatılır. Normal normal ifade sözdiziminden farka dikkat edin.

Burada bash kabuğu komut dosyasında dize işleme hakkında daha fazla bilgi edinebilirsiniz .


değil [[ -n "$1" ]]aynı [[ ! -z "$1" "]]?
Alexander Mills

@AlexanderMills haklısınız, -n kullanmak biraz daha kısaltır. Cevabı buna göre güncelledim.
elomage

6

Bir dizenin boş olup olmadığını veya yalnızca boşluk içerip içermediğini kontrol etmek için şunları kullanabilirsiniz:

shopt -s extglob  # more powerful pattern matching

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

Bash Kılavuzundaki Kabuk Parametresi Genişletme ve Kalıp Eşleştirme bölümüne bakın .


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

Dizeden tüm satırların ve boşlukların çıkarılması, boş bir satırın test edilebilecek ve üzerinde işlem yapılabilecek hiçbir şeye indirgenmesine neden olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.