Ошибка «0: команда не найдена» при запуске сценария bash

Это мой сценарий:

echo "please enter any number"
read n
a= $(($n % 2))
if [ $a -eq 0 ]; then
    echo "EVEN"
else
    echo "ODD"
fi

Это вывод сценария:

$ source first.sh 
please enter any number
2
0: command not found
ODD

Это похоже на то, что выполняется любое значение, которое я даю только остальной части.

Что может быть причиной ошибки здесь?

1
задан 25 July 2020 в 14:43

2 ответа

Проблема в пробеле после a = . Назначение переменной должно быть a = $ (($ n% 2)) .

В общем, пробелы важны в скриптах Bash. Как указано в ответе cas в этом соответствующем вопросе Unix & Linux (который, я думаю, стоит проверить):

  • Вещи, не разделенные пробелом, рассматриваются как одно «слово» .

  • Вещи, разделенные одним или несколькими пробельными символами, считаются двумя (или более) словами.

Это имеет интересный смысл: если присвоение переменной записывается как a = $ (($ n% 2)) , значение рядом с = , т. е. $ (($ n% 2)) , присваивается a , как и ожидалось.

Однако, если присвоение переменной записывается как a = $ (($ n% 2)) , то значение рядом с = является просто пустым пространством, которое будет присвоено а . Bash будет обрабатывать a как переменную среды со значением пустой строки, а затем переходит к оценке $ (($ n% 2)) , которая, в зависимости от значения n , будет либо 0 , либо 1 . Вот почему вы получите сообщение об ошибке 0: команда не найдена или 1: команда не найдена , в зависимости от случая.

После этого сценарий будет продолжен до оператор if-else . Выражение [$ a -eq 0] всегда возвращает следующую ошибку (не показано в вашем вопросе), поскольку значение a является пустой строкой:

[: -eq: unary operator expected

Итак, Ну наконец то,

1
ответ дан 30 July 2020 в 22:03

Bash has its own helpful options to determine what's happening. the -v echos each line as read, and the -x prints out the line executed (after variable substitution, etc.)

$ bash -vx first.sh
bash -vx first.sh
echo "please enter any number"
+ echo 'please enter any number'
please enter any number
read n
+ read n
4
a= $(($n % 2))   
+ a=           <======As a comment mentioned, a space causes problems
+ 0
first.sh: line 3: 0: command not found
if [ $a -eq 0 ]; then
    echo "EVEN"
else
    echo "ODD"
fi
+ '[' -eq 0 ']'
first.sh: line 4: [: -eq: unary operator expected
+ echo ODD
ODD
1
ответ дан 30 July 2020 в 22:03

Другие вопросы по тегам:

Похожие вопросы: