2017-04-06 3 views
2
#!/bin/bash 
echo "===========3333333=====" 

if [ $0 == "test" ] || $0 == "all" ];then 
    echo "---" 
fi 

Endlosschleife Ausgang:warum dieses Shell-Skript ausgegeben, so seltsam

===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 

obwohl ich weiß, dass das falsch eckigen Klammern Missing if [$ 0 == "test"] || [$ 0 == "all"]; dann aber warum so ausgeben ???

Antwort

4

Betrachten Sie die Linie if [ $0 == "test" ] || $0 == "all" ]

Dies ist von der Form if cmd1 || cmd2, wo cmd1 [ $0 == "test ] und cmd2 ist $0 == "all" ]

Das zweite Befehl mit Argumenten Skript aufruft ==, all und ]. Du hast also eine Rekursion.

Denken Sie daran, [ ist nicht Teil der Shell-Grammatik. Es ist nur ein Befehl mit der seltsamen Eigenschaft, dass das letzte Argument ] sein muss.

+0

Herstellung Während diese Sinn macht, bin ich immer noch nicht sicher, welches Wort der Rekursion initiiert? Möchten Sie mehr erklären? – Inian

+2

Es gibt einige interessante Dinge zu beachten. Insbesondere rekursiert das Skript, wenn es als './Test.sh' aufgerufen wird, aber * nicht *, wenn es als' bash test.sh' aufgerufen wird, da dies zu einem anderen $ 0 führt. –

+0

@ JanHudec: Ja, guter Punkt! War kurz davor, es zu erwähnen! – Inian

1
$0 == "all" ];then 

In diesem Abschnitt wird die Rekursion gestartet. weil $ 0 das Skript wieder startet.

zum Beispiel unter Code gleiches Ergebnis

#!/bin/bash 
echo "===========3333333=====" 
$0 bash is not checking below!!!!!!!!!! 
     echo "ok" 
fi 
Verwandte Themen