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

実行中。((COUNT ++)) - > "COUNT ++:見つかりません"シェルスクリプト

$ 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 

答えて

7

あなたはbashの固有の操作を使用したい場合は、おそらく一番上に#!/bin/bashではなく#!/bin/shをしたいです。

あなたのスクリプトは私のMacでうまく動作します。shは実際にはbashです。あなたのshが本当のものなら、あなたはあまり運がないかもしれません。

+0

算術置換は 'bash'だけでなくPOSIXです。 – geekosaur

+0

OPの 'sh'は完全にPOSIXではないかもしれません - 違いは何ですか? –

+1

@geekosaur '(())'構造はPOSIXであるとは思えませんが、 '$(())'はあります。例えば、 'dash'は全く同じ方法でOPのスクリプトについています。 – Clueless

5

(())は、コマンドCOUNT++の呼び出しでネストされたサブシェル(実際には2つ)です。算術置換のメカニズムを$(())にしたいと思っています。実際にはの代わりにとなるため、コメント内で非表示にするか、または置換を含むインクリメントを使用します。

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

または

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

OPのスクリプトは、ここでは 'bash'でうまく動作しますが、' $ 'は必要ありません。 –

+0

@CarlNorumあなたが正しいです。これについて教えてくれてありがとうgeekosaur。 – yayu

+0

:コメントは開始しません。この場合、単一の引数を取ることはノーオペレーションです。コメントは#で示されます。 (しかし、とにかく+1) –

0

この:((COUNT++))は、あなたがやりたいことはありません。

変更するには:let "COUNT++"

参照:bashで算術演算の詳細についてhttp://tldp.org/LDP/abs/html/ops.html

そして、bashのを使用するために、help forから#!/bin/bashではなく#!/bin/sh

+0

の使用のマークこれは動作します。 letがshで定義されていないので、shからbashへの切り替えが必要でした。 – yayu

+2

'let'と'(()) 'は' bash'で文字通り同一です。 manページでもこう書いています: "'(()) '...これはlet 'expression'と全く同じです。" –

+2

@yayuあなたの問題を解決したのは、「let」に切り替えるのではなく、Bashに切り替えることでした。 'let'はBashの'(())と同じですが、どちらもPOSIXで定義されていません。 Debianベースのシステム(Debian、Ubuntu、Mint、または他の多くの品種の1つ)にいる場合、 'sh'はおそらくDashです。これは、POSIXが必要とするものをはるかに超えてサポートする最小限のシェルです。 –

2

を使用します。

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. 

bashを使用して、それを実行することを忘れないでください。

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

このスクリプトを書く方が良い方法です。そして、私は次のようにスクリプトを実行することをお勧めいたします:
./script.sh
または
bash ./script.sh

あなたがこの方法を使用して、bashのを持っていない場合:

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

鉱山はちょうど私は、このエラーを与えていました私はsh(ex。sh code.sh)で実行しようとしたので、私が./code.shを実行したときに動作しました。順次ファイルの名前を変更するcount++を使用して変数をインクリメントするとき#!/bin/shから#!/bin/bashに変更

0

は私のために夢のように働きました。私も

数++得たとき

#!/bin/shを開始する元のスクリプトは(Debianの)Fedoraのではなく、カーリーにうまく働いた:

単に置き換える#!/bin/shこの罰金を固定#!/bin/bashには見られないが - おそらくKali/Debianのデフォルトのシェルはbashではないからです。これは、私が考えるダッシュを使用していたKaliの設定時にデフォルトのシェルを変更する必要があることと一貫しています。

関連する問題