Niektóre historyczne powłoki zaimplementowały bardzo prosty analizator składni, który mógł zostać pomylony przez rzeczy, takie jak to, [ -n = "" ]
gdzie pierwszy operand =
wygląda jak operator, i parsowałby to jako [ -n = ]
lub spowodował błąd składniowy. W [ "x$1" = x"" ]
, na x
, zapewnia prefiks, który x"$1"
nie może wyglądać jak operatora, a więc tylko w ten sposób powłoka może przetworzyć tego testu jest traktowanie =
jako operatora binarnego.
Wszystkie współczesne powłoki, a nawet większość starszych powłok, które nadal działają, są zgodne z regułami POSIX, które nakazują prawidłowe analizowanie wszystkich wyrażeń testowych o długości do 4 słów. Więc [ -z "$1" ]
jest właściwym sposobem testowania jeśli $1
jest pusta , a [ "$x" = "$y" ]
to właściwa droga do testowania równości dwóch zmiennych.
Nawet niektóre bieżące powłoki mogą zostać pomylone z dłuższymi wyrażeniami, a kilka wyrażeń jest w rzeczywistości niejednoznacznych, więc unikaj używania operatorów -a
i -o
do konstruowania dłuższych testów boolowskich, a zamiast tego używaj osobnych wywołań do [
oraz własnych &&
i ||
boolowskich operatorów powłoki .
Gilles „SO- przestań być zły”
źródło
sh
na niektórych komercyjnych Uniksach nadal mają problem. Zobacz tutaj po szczegóły.[ -z "$1" ]
jest właściwym sposobem sprawdzenia, czy$1
jest puste .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- oba zwracają 0, ale w drugim przypadku$1
nie mogą być puste, ponieważ nie istnieje.Według http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html The
-z
Test jest niebezpieczne w niektórych implementacjach , przypuszczalnie gdy „ciekawe” struny lubię"-o a=a"
są testowane.źródło
Powyższe testy spowodują również błąd, jeśli uruchomisz z „set -u” lub „set -o rzeczownik”
Bardziej stabilnym sposobem sprawdzenia pustej zmiennej byłoby użycie rozszerzenia parametrów :
MYVAR = $ {MYVAR: - „Zła wartość”}
Ta metoda działa dla tradycyjnej powłoki bourne, a także dla ksh i bash.
źródło
źródło
=
kontra-z
teraz, w jaki sposób.