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

Я пытаюсь увеличить значение переменной в bash script и не работает. Вот мой код:

#! /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. 

Ответ 1

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

COUNTER=$(expr $COUNTER + 1)

выход из темы...

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

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

Ответ 2

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

COUNTER=`expr $COUNTER + 1`

Ответ 3

Другой способ.

COUNTER=$(($COUNTER + 1))

Ответ 4

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