2011-01-06 7 views
4

Ich werde auf das Fleisch und Knochen erhalten:Shell-Skript variablen Einsatz

MY_VAR=6 
until [$MY_VAR = 0] 
do 
dir/dir_$MY_VAR.log 
ps | grep "NAME_$MY_VAR.ksh" 
check some things 
if [results = ok] 
echo "program $MY_VAR sucessful" 
else 
echo "program $MY_VAR failure" 
MY_VAR = `expr $MY_VAR - 1` 
done 

Jetzt bin ich die folgenden Fehler bekommen my_var nicht gefunden und [6: nicht gefunden, so dass ich einen ziemlich noobish Fehler unter der Annahme, . Ich denke, die Logik ist solide genug, nur ein einfacher Syntaxfehler, den ich irgendwo durch das Aussehen der beiden Fehler mache, von denen ich denke, dass es in der Deklaration sein könnte.

Antwort

3

Sie benötigen einen Platz nach [ haben und vor ] da [ ist eigentlich ein Befehl und kein Trennzeichen.

Hier wird in Bash (oder KSH) Ihr Skript neu geschrieben:

my_var=6 
until ((my_var == 0)) 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
     ((my_var--)) 
    fi 
done 

jedoch:

for my_var in {6..1} 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
    fi 
done 
+0

Ich bekomme den Fehler MY_VAR--: mehr Token erwartet, könnten Sie auf Ihre Lösung wie die Verwendung von (()) und [[]] – Jewsef

+0

@Jewsef: Mit welcher Shell und auf welcher Linie von welcher Version von die Skripte von meiner Antwort? Eine Sache zu beachten, ich hatte den Fall des Variablennamens geändert, aber ich tat dies inkonsistent. Das könnte einige Probleme verursacht haben. Entschuldigung - ich habe es behoben. In bash und ksh doppelte eckige Klammern [einige zusätzliche Funktionen aktivieren] (http://mywiki.wooledge.org/BashFAQ/031). Wenn Sie doppelte Klammern für numerische Vergleiche verwenden, können Sie zum Beispiel '==' und '>' anstelle des hässlichen '-eq' und' -gt' verwenden. Sie können auch arithmetische Operationen wie das angezeigte Dekrement '((my_var -))' ausführen. –

+0

@Jewsef: Ich habe gerade bemerkt, dass das Skript in Ihrer Frage die 'fi' fehlt, um das' if' zu schließen. Ich habe dein Skript in meine Antwort kopiert und es vergessen (das jetzt behoben). Das könnte die Ursache Ihres Fehlers sein. –

0

Ihre zwei Fehler werden verursacht durch:

  • until [$MY_VAR = 0]
  • MY_VAR = $(expr $MY_VAR - 1)

[Ich habe verwendet $() anstelle von Backticks, weil ich nicht Backticks in den Codeabschnitt bekommen kann]

Das erste Problem ist der Mangel an Räumen um die eckigen Klammern - an beiden Enden. Die Shell sucht nach dem Befehl [6 (nach dem Erweitern $MY_VAR) anstelle von [ (schauen Sie sich /usr/bin/[ an - es ist eigentlich ein Programm). Sie sollten auch -eq verwenden, um numerische Vergleiche durchzuführen. = sollte ok hier arbeiten, aber führende Nullen können einen String-Vergleich zu brechen, wo ein numerischer Vergleich funktionieren würde:

until [ "$MY_VAR" -eq 0 ] 

Das zweite Problem ist, dass Sie Leerzeichen in Variablenzuweisung haben. Wenn Sie MY_VAR = ... schreiben, sucht die Shell nach dem Befehl MY_VAR. Stattdessen schreiben Sie es als:

MY_VAR=`expr $MY_VAR - 1` 

direkt Diese Antworten Ihre Fragen beantworten, aber man sollte Dennis Williamson Antwort für bessere Möglichkeiten studieren, diese Dinge zu tun.

+0

Es ist wahr, dass '[' existiert als '/ usr/bin/[', aber es ist auch eine eingebaute Shell, und als solche hat Vorrang. Seien Sie vorsichtig, wenn Sie sich auf das Verhalten der führenden Null verlassen, '[008 -eq 8]' funktioniert, aber '[[008 -eq 8]]' gibt einen "zu großen Wert für die Basis" -Fehler. Backticks sollten trotzdem vermieden werden, die Verwendung von '$()' wird bevorzugt. –