Почему эта команда bash expr не работает? [дубликат]

этот вопрос уже есть ответ здесь:

Я пытаюсь увеличить переменную в скрипте 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 назначение являются backticks.

I пробовал заменить COUNTER С $COUNTER такой:

$COUNTER = `expr $COUNTER + 1`

но это не решило проблему и дало мне следующую ошибку:

line7: 0: command not found. 

4 ответов


As @Cory правильно указал, не должно быть пробелов вокруг знака равенства, иначе Баш будет путать COUNTER для команды.

COUNTER=$(expr $COUNTER + 1)

теме ...

тем не менее, вы можете избежать того, чтобы bash fork подпроцесс, используя следующие альтернативы:

фактически, ваш цикл 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

что баш в конечном итоге увидеть 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

удалите пробелы вокруг знака равенства:

COUNTER=`expr $COUNTER + 1`

другой путь.

COUNTER=$(($COUNTER + 1))

for i in {0..4}; do 
    echo "i will add this line to file mycreation" >> ./myfile
done