it-swarm-eu.dev

Testování, zda je proměnná prázdná ve skriptu Shell

Viděl jsem následující techniku ​​používanou mnohokrát na mnoha různých granátech, abych otestoval, zda je proměnná prázdná:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

Existují nějaké výhody při používání tohoto oproti více kanonickým if [ -z "$1" ]? Může to být problém s přenositelností?

27
rahmu

Některé historické skořepiny implementovaly velmi jednoduchý parser, který by mohl být zmaten věcmi jako [ -n = "" ] kde první operand na = vypadá jako operátor a analyzoval by to jako [ -n = ] nebo způsobit chybu syntaxe. V [ "x$1" = x"" ], předpona x zajišťuje, že x"$1" nemůže vypadat jako operátor, a tak jediný způsob, jakým může Shell analyzovat tento test, je ošetřování = jako binární operátor.

Všechny moderní skořápky, a dokonce i většina starších skořápek, které jsou stále v provozu, se řídí pravidly POSIX , které nařizují, aby byly všechny testovací výrazy až 4 slov správně analyzovány. Takže [ -z "$1" ] je správný způsob testování, pokud $1 je prázdné a [ "$x" = "$y" ] je správný způsob, jak otestovat rovnost dvou proměnných.

Dokonce i některé současné skořápky se mohou zaměňovat s delšími výrazy a několik výrazů je ve skutečnosti dvojznačných, takže se vyhněte použití -a a -o operátoři konstruují delší booleovské testy a místo toho používají samostatná volání [ a vlastní Shell && a || booleovští operátoři.

Podle http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html , -z test je nebezpečný v některých implementacích , pravděpodobně když "zajímavé" řetězce jako "-o a=a" jsou testovány.

5

Výše uvedené testy také způsobí chybu, pokud spustíte "set -u" nebo "set -o podstatné jméno"

Stabilnějším způsobem, jak zkontrolovat prázdnou proměnnou, by bylo použití rozšíření parametr :

MYVAR = $ {MYVAR: - „Špatná hodnota“}

Tato metoda funguje jak pro tradiční bourne Shell, tak pro ksh a bash.

3
Scott Hoffman
    function isBlank {
 valueNoSpaces=$(echo "[email protected]" | tr -d ' ')

 if [  "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ] 
 then
       echo true ;
 else
       echo ""  ;
 fi
}

#Test
if [ $(isBlank "      ") ] 
then
    echo "isBlank \"      \" : it's blank"
else
    echo " isBlank \"      \": it is not blank"
fi

if [ $(isBlank "abc") ] 

then
    echo "isBlank \"abc\" : it's blank"
else
    echo "isBlank \"abc\" :it is not blank"
fi

if [ $(isBlank null) ] 
then
      echo "isBlank null : it's blank"
else
    echo "isBlank null : it is not blank"
fi

if [ $(isBlank "") ] 
then
    echo "isBlank \"\" : it's blank"
else
    echo "isBlank \"\" : it is not blank"
fi

#Result
isBlank "      " : it's blank

isBlank "abc" :it is not blank

isBlank null : it's blank

isBlank "" : it's blank
0
aslam mohammed