2010-03-01 6 views
33

Ich bin mir nicht sicher, wie man eine if mit mehreren Tests in der Shell zu tun. Ich habe Probleme mit diesem Skript zu schreiben:Mit if elif in Shell-Skripten

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" && "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 && $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

Das Problem ist, ich bekomme diese Fehlermeldung jedes Mal: ​​

./compare.sh: [: fehlt `]‘ Befehl nicht

gefunden
+5

Nicht wenige Kommentatoren haben vorgeschlagen, dass Sie [[anstatt [aber das macht Ihr Skript bash-spezifisch. Sie werden weniger Wartungs- und Portabilitätsprobleme haben, wenn Sie sich an die einfache alte Bourne Shell (sh) -Syntax halten können. –

Antwort

25

sh wird die && als Shell Operator interpretiert. Ändern Sie ihn auf -a, das ist [ ‚s Verbindung Betreiber:

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] 

Außerdem sollten Sie immer die Variablen zitieren, weil [ verwirrt wird, wenn Sie Argumente wegzulassen.

5

Ändern Sie "[" in "[[" und "]" in "]]".

+1

Besser noch, ändere '[' zu 'test' –

7

Verwenden Doppelklammern ...

if [[ expression ]]

+1

Zu beachten, das ist eine Lösung, weil das Konstrukt '[[' 'in die Shell eingebaut ist, während '[' ein anderer Name für den Befehl 'test' ist und daher unterliegt seine Syntax - siehe 'man test' –

+4

Technisch ist' ['eine eingebaute Shell, aber' [['ist ein Shell-Schlüsselwort. Das ist der Unterschied. –

+1

Sehen Sie sich die Ergebnisse der bash - Befehle 'type [', 'type [[', 'help [' und 'help [['. – Apostle

2

Ich habe ein Beispiel aus Ihrem Code. Versuchen Sie Folgendes:

echo "*Select Option:*" 
echo "1 - script1" 
echo "2 - script2" 
echo "3 - script3 " 
read option 
echo "You have selected" $option"." 
if [ $option="1" ] 
then 
    echo "1" 
elif [ $option="2" ] 
then 
    echo "2" 
    exit 0 
elif [ $option="3" ] 
then 
    echo "3" 
    exit 0 
else 
    echo "Please try again from given options only." 
fi 

Dies sollte funktionieren. :)

+0

Gawd das sieht mir komisch aus. Warum nicht 'dann' nach' else'? Es kann eigentlich nicht schrullig sein, aber so sieht es aus, verglichen mit C. – Rolf

+0

Speicherplatz ist nach $ -Option erforderlich und vor = um es gut auszuführen, sonst jedes Mal 1 – PiyusG

23

Josh Lee Antwort funktioniert, aber Sie können die "& &" Operator für eine bessere Lesbarkeit wie folgt verwenden:

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 
1

Dies ist für mich arbeiten,

# cat checking.sh 
#!/bin/bash 
echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 == $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

# ./checking.sh 
You have provided the following arguments 
All of the specified args are equal 

Sie können hinzufügen "set -x" im Skript, um die Fehler zu beheben,

Danke.