синтаксис цикла for в сценариях оболочки Linux

#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 или нет.