web-dev-qa-db-ja.com

このbashexprコマンドが機能しないのはなぜですか?

Bashスクリプトで変数をインクリメントしようとしていますが、機能しません。これが私のコードです:

#! /bin/bash

COUNTER=0
while [ $COUNTER -lt 5 ]
do
    echo "i will add this line to file mycreation">>./myfile
    COUNTER = `expr $COUNTER + 1`
done

COUNTER割り当てを囲む引用符はバッククォートです。

COUNTER$COUNTERに次のように置き換えてみました。

$COUNTER = `expr $COUNTER + 1`

しかし、それでは問題は解決せず、次のエラーが発生しました。

line7: 0: command not found. 
10
Marin

@ Cory が正しく指摘しているように、等号の前後にスペースを入れないでください。スペースを入れないと、bashがコマンドのCOUNTERを混乱させます。

COUNTER=$(expr $COUNTER + 1)

話題から外れる.。

そうは言っても、次の方法を使用することで、bashforkのサブプロセスを回避できます。

実際、whileループは次のように書くことができます。

for ((COUNTER=0; COUNTER <= 5 ; COUNTER++))
do
    echo "i will add this line to file mycreation">>./myfile
done

エラーメッセージの内訳

エラーが発生したとき:

line 7:   0:    command not found.
'-----'  '--'  '------------------'
   |       |                 |
location   |            Description of error.
          culprit 

私の推測では、7行目にあったものは

$COUNTER = `expr $COUNTER + 1`
--------   --------------------
    |                 |
Evaluated to 0        |
                  Evaluated to 1

最終的にbashに表示されるのは0 = 1であり、bashステートメントは通常command arg1 arg1 ...の形式であるため、bashはそれを引数0を指定してコマンド= 1を実行すると解釈します。したがって、エラーメッセージ:0: command not found

等号の周りのスペースを削除すると、bashが解釈するのは次のとおりです。

0=1

これは、引数なしでコマンド0=1を実行することを意味するため、エラー0=1: command not foundになります。

変数の割り当てはVAR_NAME=VALUE$なし)の形式である必要があるため、使用する構文は次のとおりです。

COUNTER=`expr $COUNTER + 1` # or any of the variants above

どのbashが評価し、最終的に次のように解釈します。

COUNTER=2
32
Shawn Chin

等号の周りのスペースを削除します。

COUNTER=`expr $COUNTER + 1`
6
Cory Klein

別の方法。

COUNTER=$(($COUNTER + 1))
3
webbi
for i in {0..4}; do 
    echo "i will add this line to file mycreation" >> ./myfile
done
2