2016-08-03 36 views
-1

Also raus Ich versuche, diesen wenn elif Code in UNIX mit „Bash-Skript“, und es gibt mir diese Ausgabebash Fehler „Befehl nicht gefunden“ bei der Verwendung, wenn mit „oder“ Operator

script[11]: pc4: command not found 
script[14]: pc4: command not found 

statt "-o" Ich hatte vorher "|" als "oder" Operator aber das hat nicht funktioniert. Auch ich Klammern hatte vor, aber ja ...

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if "$host" = "$test1" -o "$host" = "$test2" 
    then 
     echo "test loaded" 
elif "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

edit: es behoben, es musste sein:

if [ "$host" = "$test1" -o "$host" = "$test2" ]; 
... 
... 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ]; 

Dank an alle!

+1

'|' Rohrleitungen ist, '' || würde sein oder. Aber 'if' funktioniert basierend auf dem Rückgabewert eines Befehls, also möchten Sie die Bedingung in' [...] 'umbrechen. Beachten Sie, dass '[' selbst ein Befehl und kein Teil einer Syntax ist. – Siguza

+0

@Siguza okay, versuchte es erneut mit dem Hinzufügen von [], jetzt funktioniert es, vielleicht habe ich vergessen, Leerzeichen nach und vor Klammern zu verwenden. Danke, ist || = oder nur für bash oder auch allgemein das oder?dachte, es sei | –

+0

In den meisten Programmiersprachen ist '|' bitweise oder während '||' logisch oder ist. – Siguza

Antwort

3

Sie rufen keinen Befehl an; -o ist ein Operator des Befehls test, obwohl seine Verwendung nicht empfohlen wird.

if test "$host" = "$test1" -o "$host" = "$test2" 
then 
    echo "test loaded" 
elif test "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

Stattdessen verwenden mehrere Aufrufe test durch den OperatorSchale verbunden ||. (Zeilenumbrüche leicht nach || für Lesbarkeit hinzugefügt werden.)

if test "$host" = "$test1" || 
    test "$host" = "$test2" 
then 
    echo "test loaded" 
elif test "$host" = "$prod1" || 
    test "$host" = "$prod2" || 
    test "$host" = "$prod3" || 
    test "$host" = "$prod4" 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

Schließlich Sie können stattdessen mit einer case Anweisung zu berücksichtigen:

case $host of 
    "$test1"|"$test2") echo "test loaded" ;; 
    "$prod1"|"$prod2"|"$prod3"|"$prod4") echo "prod loaded" ;; 
    *) echo "bad host" ;; 
esac 
0

Sie benötigen if und elif Bedingungen in Klammern setzen:

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [ "$host" = "$test1" -o "$host" = "$test2" ] 
    then 
     echo "test loaded" 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ] 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

Bitte beachten Sie, dass der Raum vor und nach [ entscheidend ist.

+2

"Brackets" sind keine Shellsyntax: '[' ist ein ** Befehl **, der als eingebaute Shell implementiert oder in '/ usr/bin/[' (oder '/ bin/[', abhängig von Ihr Betriebssystem) - und das wird oft durch den gleichen Befehl wie der "Test" -Befehl implementiert (entweder durch einen zweiten Eintrag für die gleiche eingebaute Funktion oder eine Hardlink zu derselben Datei auf der Platte). Außerdem wird "-o" von der aktuellen Version des POSIX-Teststandards explizit als veraltet markiert; siehe http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html (und die verschiedenen '[OB]' - Markierungen). –

0

-o ist eine Syntax, die von test Befehl oder [ Befehl unterstützt wird.

umschließen So Ihr Zustand withing [ und ] wie gezeigt:

if [ "$host" = "$test1" -o "$host" = "$test2" ]; 
then 
     echo "test loaded" 
elif [ "$host" = "$prod1" -o "$host" = "$prod2" -o "$host" = "$prod3" -o "$host" = "$prod4" ]; 
then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 

Siehe diese link

+2

Beachten Sie, dass der moderne POSIX-Teststandard "-o" und "-a" als veraltet markiert und Aufrufe von "test" mit mehr als vier Argumenten als vom Standard undefinierten Ergebnissen bezeichnet. Siehe '[OB]' in http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html –

0

dies versuchen;

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [ "$host" = "$test1" ] || [ "$host" = "$test2" ] ; then 
echo "test loaded" 
elif [ "$host" = "$prod1" ] || [ "$host" = "$prod2" ] || [ "$host" = "$prod3" ] || [ "$host" = "$prod4" ] 
    then 
     echo "prod loaded" 
else 
     echo "bad host" 
fi 
0

Händler:

#!/bin/bash 
host=`hostname` 
test1="pc4" 
test2="pc5" 
prod1="t01" 
prod2="t02" 
prod3="t03" 
prod4="t04" 
path="/home/test1/test2/test3" 

if [[ "$host" == "$test1" ]] || [[ "$host" == "$test2" ]] 
then 
    echo "test loaded" 
elif [[ "$host" == "$prod1" ]] || [[ "$host" == "$prod2" ]] || [[ "$host" == "$prod3" ]] || [[ "$host" == "$prod4" ]] 
then 
    echo "prod loaded" 
else 
    echo "bad host" 
fi 

Obwohl es nur wahr ist, dass ein „=“ für String-Gleichheitsvergleich erforderlich ist, die „=“ auch als Zuweisungsoperator verwendet wird. Um mögliche Verwirrung zu vermeiden, würde ich daher "==" für die String-Gleichheit verwenden. Es ist so, dass "==" nur ein Synonym für "=" ist, aber ich bevorzuge es, den gleichen Operator nicht für mehrere Zwecke zu verwenden.
HINWEIS: Ich unterstelle keine POSIX-Kompatibilität.

+0

Wenn du '==' over '=' vorschlagen willst, benutze '[[]] Auch das bedeutet nicht, dass Sie mit POSIX-Tests kompatibel sind, für die der Standard explizit nur "=" als unterstützt definiert. –

+0

@CharlesDuffy - Guter Punkt, ich werde das zu meiner Antwort hinzufügen. Vielen Dank. – tale852150