2012-04-09 4 views
1
#!/bin/sh 
INTERVAL=1 
COUNT=0 
while [ $COUNT -le 9 ] 
do 
    ((COUNT++)) 
    sleep $INTERVAL 
    echo "count is $COUNT" 
done 

Bei der Ausführung.((COUNT ++)) -> "COUNT ++: nicht gefunden" im Shell-Skript

$ sh ascript 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 
count is 0 
ascript: 9: COUNT++: not found 

Antwort

7

Sie wollen wahrscheinlich #!/bin/bash statt #!/bin/sh an der Spitze, wenn Sie bash-spezifische Operationen verwenden möchten.

Ihr Skript funktioniert hier auf meinem Mac, wo sh wirklich nur bash ist. Wenn Ihre sh eine echte ist, haben Sie vielleicht nicht so viel Glück.

+0

Arithmetische Substitution ist POSIX, nicht nur 'bash'. – geekosaur

+0

Vielleicht ist OPs 'sh' dann nicht komplett POSIX - was ist der Unterschied? –

+1

@geekosaur Ich glaube nicht, dass das nackte '(())' Konstrukt POSIX ist, obwohl '$ (())' ist. Zum Beispiel, "Dash" Drosseln auf OP-Skript in genau der gleichen Weise. – Clueless

5

(()) wäre eine verschachtelte Subshell (zwei von ihnen tatsächlich) mit einem Aufruf eines Befehls COUNT++. Sie möchten den arithmetischen Substitutionsmechanismus $(()); aber das wird tatsächlich ersetzen, so dass Sie es entweder in einem Kommentar ausblenden oder ein Inkrement verwenden möchten, das eine Substitution beinhaltet.

: $((COUNT++)) # : is a shell comment 

oder

COUNT=$(($COUNT + 1)) 
+0

Das OP-Skript funktioniert gut für mich hier mit 'bash', kein' $ 'erforderlich. –

+0

@CarlNorum du hast Recht. Danke, Geekosaur, dass du mir davon erzählt hast. – yayu

+0

: beginnt keinen Kommentar; Es ist ein No-Op, in diesem Fall ein einziges Argument. Kommentare sind mit # gekennzeichnet. (Aber +1 trotzdem) –

0

Dies: ((COUNT++)) nicht tut, was Sie wollen.

Wechseln zu: let "COUNT++"

See: http://tldp.org/LDP/abs/html/ops.html für mehr auf arithmetische Operationen in bash.

Und bash zu verwenden, verwenden Sie #!/bin/bash statt #!/bin/sh

+0

Das funktioniert. (musste von sh zu bash wechseln, wie in sh nicht definiert) – yayu

+2

'let' und' (()) 'sind buchstäblich identisch in' bash'. Die man-Seite sagt sogar so: "' (()) '... Das ist genau gleichbedeutend mit 'Ausdruck'." –

+2

@yayu Es wurde zu Bash gewechselt, nicht auf "Let" geschaltet, das hat dein Problem behoben; 'let' ist dasselbe wie' (()) 'in Bash, aber keines davon ist in POSIX definiert. Wenn Sie auf einem Debian-basierten System (Debian, Ubuntu, Mint oder einer der vielen anderen Varianten) sind, ist 'sh' wahrscheinlich Dash, eine minimalistische Shell, die nicht viel mehr unterstützt, als POSIX benötigt. –

2

Von help for:

for ((: for ((exp1; exp2; exp3)); do COMMANDS; done 
    Arithmetic for loop. 

    Equivalent to 
     ((EXP1)) 
     while ((EXP2)); do 
       COMMANDS 
       ((EXP3)) 
     done 
    EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is 
    omitted, it behaves as if it evaluates to 1. 


    Exit Status: 
    Returns the status of the last command executed. 

Vergessen Sie nicht, um es auszuführen bash verwenden.

3
#!/bin/bash 
COUNT=0; 
while [ $COUNT -le 9 ] ; 
do sleep 1; 
((COUNT++)) ; 
echo $COUNT ; 
done 

Es ist eine bessere Möglichkeit, dieses Skript zu schreiben. Und ich empfehle Ihnen Ihr Skript wie folgt auszuführen:
./script.sh
oder
bash ./script.sh

Wenn Sie bash nicht haben, verwenden Sie diese Art und Weise:

#!/bin/sh 
ENV=1 
while [ $ENV -le 10 ] 
do 
sleep 1 
echo $ENV 
ENV=`expr $ENV + 1` 
done 
0

Mine mir diesen Fehler gab nur weil ich versucht habe, es mit sh (ex. sh code.sh) auszuführen, aber als ich tat ./code.sh es funktionierte.

0

Wechsel von #!/bin/sh zu #!/bin/bash funktionierte wie ein Traum für mich beim Inkrementieren einer Variablen mit count++ zum sequentiellen Umbenennen von Dateien.

Das ursprüngliche Skript #!/bin/sh funktionierte gut in Fedora begonnen, aber nicht in Kali (Debian), wenn ich bekam auch

Zählung ++: nicht

einfach ersetzt #!/bin/sh-#!/bin/bash fixiert diese feine gefunden - vermutlich weil die Standard-Shell in Kali/Debian nicht bash ist. Dies steht im Einklang damit, dass ich die Standard-Shell ändern muss, wenn ich Kali konfiguriere, das Dash verwendet, denke ich.