2012-11-22 9 views
45

Próbuję uruchomić następujący skrypt powłoki, który ma sprawdzić, czy łańcuch nie jest ani spacji, ani pusty. Jednak otrzymuję taki sam wynik dla wszystkich 3 wymienionych łańcuchów. Próbowałem również użyć składni "[[", ale bez skutku.Sprawdź, czy ciąg nie jest pusty, czy spacja w skrypcie powłoki

Oto mój kod:

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 

otrzymuję następujący wynik:

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

Odpowiedz

76

Potrzebujesz miejsca po obu stronach !=. Zmienić swój kod do:

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 
+0

Wielkie dzięki, działa. Zastanawiam się jednak, dlaczego zlecenie nie korzysta z przestrzeni, podczas gdy porównanie ma miejsce. –

+5

^^ To jest składnia. Pierwsze słowo w wierszu poleceń to polecenie, a kolejne to argumenty. 'var = value [command [args]]' to składnia, w której zmiennej przypisuje się wartość. dla porównania, '[' ('/ usr/bin/[') jest poleceniem i wymaga od zmiennych 1,! = i var2 3 oddzielnych argumentów. var1! = var2 jest pojedynczym argumentem. – anishsane

+0

@anishsane Wielkie dzięki za szczegóły, otrzymuję je teraz =) –

40

Do sprawdzania pusty ciąg w skorupkach

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

LUB

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

operatora równości ciąg skorupa jest '='. '==' jest nieprzenośnym hackiem wymyślonym przez autorów powłoki, aby zepsuć umysły młodych programistów. – Jens

6

Aby sprawdzić, czy ciąg jest pusta lub zawiera spacje tylko możesz użyć:

shopt -s extglob # more powerful pattern matching 

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

Zobacz Shell Parameter Expansion i Pattern Matching w Podręczniku bash.

+1

Czy możesz wyjaśnić to nieco w celach edukacyjnych? To wygląda jak bełkot ^^; Czy to jest jak grep czy coś takiego? –

+1

@Keith M: Sprawdź linki do dokumentów, które podałem w poście. –

11

W przypadku trzeba sprawdzić na dowolnej ilości spacji, a nie tylko pojedyncze miejsca, można to zrobić:

Aby rozebrać ciąg dodatkowym białym przestrzeni (condences również spacje w środku jednej przestrzeni):

trimmed=`echo -- $original` 

The -- zapewnia, że ​​jeśli $original zawiera przełączniki rozumiane przez echo, będą nadal uważane za normalne argumenty mają być powtórzone. Ważne jest również, aby nie umieszczać "" wokół $original, ponieważ spacje nie zostaną usunięte.

Po tym można po prostu sprawdzić, czy $trimmed jest pusty.

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

W powłoce burskiej kończę z "-" jako wartością przyciętego. –

2

Kolejny szybki test dla sznurka, który ma coś w sobie, ale miejsce.

if [[ ! -z "${str/ //}" ]]; then 
    echo "It is not empty!" 
fi 
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty" 

odizolowania wszystkie znaki nowej linii i spacje z łańcucha spowoduje pusty jedną zostać zredukowana do zera, które mogą być sprawdzone i rozpatrzony