Почему эта команда 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 подпроцесс, используя следующие альтернативы:
-
С помощью bash builtin ' let ' команда:
let COUNTER="COUNTER + 1"
-
или, используя bash c-style выражение:
(( COUNTER++ ))
фактически, ваш цикл 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