Testen auf nicht gesetzte Variablen in einer For-Schleife

Testen auf nicht gesetzte Variablen in einer For-Schleife

Ich habe ein Skript geschrieben, das eine Datei analysiert und Variablen entsprechend einer festen Breite innerhalb der Datei festlegt.

Ich möchte dann jede Variable prüfen und, wenn es ein leeres Feld ist, auf "0" setzen. Eine einfache Variante davon wäre:

one=1  
two=""  
three=3  
four=""  

for num in $one $two $three $four  
do  
   echo num is $num  
done

gibt mir eine Ausgabe von:

num is 1   
num is 3

Ich möchte Code für erstellen if $two is null then two=0.

Wie kann ich das machen?

Antwort1

Sie möchten den Vergleichsoperator -z http://tldp.org/LDP/abs/html/comparison-ops.html

if [ -z $two ]; then   ## or [ -z $num ] to test them all 
    two=0
fi
echo "num is $num"

Antwort2

Ihre Frage ergibt nicht viel Sinn. Erstens, wenn Sie sagen

one=1
two=""
three=3
four=""

for num in $one $two $three $four
do

dann forwird die Aussage interpretiert als

for num in 1  3

und es gibt also nur zwei Iterationen mit numgleich 1und . Wenn Sie vier Iterationen mit gleich , (null) und (null) 3haben möchten , müssen Sie sagennum13

for num in "$one" "$two" "$three" "$four"

Sie sollten Shell-Variablenreferenzen in Anführungszeichen setzen, es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun.

Also,

for num in "$one" "$two" "$three" "$four"
do
    echo "num is $num"
done

wird darin enden, dass

num is 1
num is 
num is 3
num is 

1Wenn Sie nun als Ergebnis , 0, 3, , wünschen 0, müssen Sie nur sagen

for num in "$one" "$two" "$three" "$four"
do
    if [ "$num" = "" ]
    then
        num=0
    fi
    echo "num is $num"
done

Beachten Sie, dass

  • [Vor und nach dem , müssen Leerzeichen vorhanden sein .
  • =Vor und nach dem , müssen Leerzeichen vorhanden sein .
  • Sie müssen Leerzeichen vor dem ] (und danach, falls noch etwas danach kommt) haben und
  • fiwird ifrückwärts buchstabiert.

Aber in Ihrem Fragentitel steht „nicht gesetzte Variablen“.  twoUnd foursindSatzin eine leere Zeichenfolge; fiveund six(und orange, pumpkin, tiger, und eine quasi unendliche Liste anderer möglicher Variablennamen) sindnicht gesetztEs gibt einen Unterschied. WennDasist das, was Sie interessiert, müssen Sie eine andere Frage stellen, denn wenn Sie

for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do

dann ist es unmöglich, die Iterationen five, six, orange, pumpkin, und , von den Iterationen und zu unterscheiden – wird in allen sieben Fällen auf eine leere Zeichenfolge gesetzt. Sie müssten die Variablen und (usw.) direkt testen.tigertwofournum$four$five

PS: Stellen Sie keine neue Frage. Führen Sie eine Suche durch. Dies wurde bereits beantwortet.

verwandte Informationen