#linux #bash #shell #for-loop #dash-shell
#linux #bash #оболочка #цикл for #dash-оболочка
Вопрос:
У меня проблема с реализацией цикла for. Я получаю эту ошибку при выполнении своего скрипта
test1.sh : 2: Синтаксическая ошибка: Неверная переменная цикла for
Я не понимаю эту ошибку.
Это мой скрипт
#!/bin/bash
for (( c=1; c<=5; c ))
do
echo "Welcome $c times..."
done
кто-нибудь может подсказать мне синтаксис цикла for в оболочке sh (в ubuntu он ссылается на dash shell) в ubuntu?
Комментарии:
1. Я не получаю ту же ошибку, что и вы, из-за этого — я получаю неожиданный конец файла. В любом случае, у вас отсутствует точка с запятой.
2. У меня это работает. Вероятно, у вас в тексте скрыт странный символ.
3. Для bash синтаксис кажется прекрасным. Можете ли вы попытаться убедиться, что вы используете правильную оболочку?
ls -l /bin/bash
, может быть?4. У меня это работает, когда вы помещаете оператор done в отдельную строку.
5. Я запустил его, используя sh вместо bash. Отлично работает в bash. Спасибо всем.
Ответ №1:
Вероятно, вы запускаете его с помощью sh
, а не bash
. Попробуйте bash test1.sh
, или ./test1.sh
если это исполняемый файл, но не sh test1.sh
.
Комментарии:
1. Отлично работает в bash, как в данный момент показано в сообщении
2. Крелин: Вы правы. Я запустил его, используя sh вместо bash или «./». Теперь это работает хорошо. Спасибо
3. Да, в bash работает нормально. Пусть sh указывает на bash (символическая ссылка) !
Ответ №2:
Стандартная оболочка POSIX принимает только синтаксис for varname in list
Синтаксис цикла for, подобный C for (( expr1; expr2; expr3 ))
, является bashism.
Вы можете получить аналогичное поведение в стандартной оболочке POSIX, используя for c in $(seq 1 5)
Ответ №3:
Что делает
ls -l /bin/sh
выдавать на вашей машине?
Создайте sh
символическую ссылку на bash
, а затем вы можете сделать sh ./test1.sh
Ответ №4:
Ваш сценарий оболочки (как показано) выполняется как в Korn shell, так и в Bash. Некоторые мысли:
- Возможно, вам понадобится пробел после shebang (#! /bin/bash, а не #!/bin/bash). Однако Деннис Ричи изначально указал, что пробел является необязательным. Кроме того, это не ошибка, которую вы получаете с Bourne shell (вместо этого вы получаете
syntax error: '(' unexpected
). - Используете ли вы систему Windows? Просто удар в темноте. Это не похоже на ошибку Windows.
- Это система Solaris или HP / UX? Возможно, они не используют настоящие версии Bash или, возможно, более старую версию. Однако даже самая старая версия Bash распознает
for ((x;y;z))
конструкцию.
Попробуйте это:
#! /bin/bash
set -vx
echo "Random = $RANDOM" #Test for bash/Kornshell. Will be blank in other shells
echo $BASH_VERSINFO[0] = ${BASH_VERSINFO[0]} #Should only work in BASH
echo $BASH_VERSINFO[1] = ${BASH_VERSINFO[1]}
echo $BASH_VERSINFO[2] = ${BASH_VERSINFO[2]}
echo $BASH_VERSINFO[3] = ${BASH_VERSINFO[3]}
echo $BASH_VERSINFO[4] = ${BASH_VERSINFO[4]}
echo $BASH_VERSINFO[5] = ${BASH_VERSINFO[5]}
for ((c=0, c<=5, c ))
do
echo "Welcome $c times"
done
set -xv
Будут отображаться все строки по мере их выполнения.$RANDOM
Должно отображаться значение, если это либо BASH, либо Kornshell (ваш цикл for будет работать в любом из них).{$BASH_VERINFO[x]}
Следует устанавливать, только если это действительно BASH. Они даже не устанавливаются, даже если вы запускаете Korn shell после того, как вы находитесь в BASH (в отличие от $ SHELL, который все еще будет содержатьbash
).
Если цикл for по-прежнему доставляет вам проблемы, просто удалите его. Где-то в этом скрипте мы узнаем, действительно ли вы выполняете оболочку bash или нет.