Próbuję uruchomić następujący skrypt powłoki, który ma sprawdzić, czy łańcuch nie jest ani spacją, ani pustym. Jednak otrzymuję te same dane wyjściowe dla wszystkich 3 wymienionych ciągów. Próbowałem również użyć składni "[[", ale bezskutecznie.
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
Odpowiedzi:
Potrzebujesz miejsca po obu stronach
!=
. Zmień kod na: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
źródło
var=value [command [args]]
to składnia, w której zmiennej przypisywana jest wartość. dla porównania,[
(/usr/bin/[
) jest poleceniem i wymaga, aby var1,! = & var2 były 3 oddzielnymi argumentami. zmienna1! = zmienna2 to pojedynczy argument.Do sprawdzania pustego łańcucha w powłoce
if [ "$str" == "" ];then echo NULL fi
LUB
if [ ! "$str" ];then echo NULL fi
źródło
=
. Jest==
to nieprzenośny hack wymyślony przez autorów powłoki, aby zepsuć umysły młodych programistów.Jeśli chcesz sprawdzić jakąkolwiek ilość białych znaków, a nie tylko pojedynczą spację, możesz to zrobić:
Aby usunąć ciąg z dodatkowych białych znaków (również warunkuje białe znaki w środku do jednej spacji):
trimmed=`echo -- $original`
W
--
gwarantuje, że jeśli$original
zawiera przełączniki rozumiane przez echo, będą nadal uważane za normalne argumenty mają być powtórzone. Również ważne jest, aby nie stawiać""
wokół$original
lub przestrzenie nie zostaną usunięte.Następnie możesz po prostu sprawdzić, czy
$trimmed
jest pusty.[ -z "$trimmed" ] && echo "empty!"
źródło
Kolejny szybki test na to, że ciąg ma coś w sobie, ale spację.
if [[ -n "${str// /}" ]]; then echo "It is not empty!" fi
„-n” oznacza ciąg o niezerowej długości.
Następnie pierwsze dwa ukośniki oznaczają wszystkie poniższe, w naszym przypadku. Następnie po trzecim ukośniku następuje zastępczy (pusty) ciąg i zamykany jest za pomocą „}”. Zwróć uwagę na różnicę w stosunku do zwykłej składni wyrażeń regularnych.
Możesz przeczytać więcej o manipulowaniu ciągami znaków w skryptach powłoki bash tutaj .
źródło
[[ -n "$1" ]]
to samo co[[ ! -z "$1" "]]
?Aby sprawdzić, czy ciąg jest pusty lub zawiera tylko spacje, 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 Rozszerzanie parametrów powłoki i dopasowywanie wzorców w podręczniku Bash.
źródło
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"
Usunięcie wszystkich nowych linii i spacji z ciągu spowoduje zredukowanie pustego do niczego, co można przetestować i zastosować
źródło