Синтаксис цикла for в сценариях linux shell

У меня проблема с реализацией цикла for. Я получаю эту ошибку, когда выполняю мой script

test1.sh: 2: Ошибка синтаксиса: неверная для переменной цикла

Я не понимаю эту ошибку.

Это мой script

#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Welcome $c times..."
done

Может ли кто-нибудь сказать мне синтаксис для цикла в sh (в ubuntu он ссылается на оболочку командной строки) в ubuntu?

Ответы

Ответ 1

Вероятно, вы запустите его с помощью sh, а не bash. Попробуйте bash test1.sh или ./test1.sh, если он выполним, но не sh test1.sh.

Ответ 2

Стандартная оболочка POSIX принимает только синтаксис for varname in list

Синтаксис C-like for-loop for (( expr1; expr2; expr3 )) является багизмом.

Вы можете получить подобное поведение в стандартной оболочке POSIX, используя for c in $(seq 1 5)

Ответ 3

Ваша оболочка script (как показано) работает как в оболочке Korn, так и в Bash. Некоторые мысли:

  • Возможно, вам понадобится место после shebang (#!/bin/ bash, а не #!/bin/bash). Тем не менее, Деннис Ритчи изначально указал, что пространство необязательно. Кроме того, это не ошибка, которую вы получаете с оболочкой Bourne (вместо этого вы получаете 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 после того, как вы находитесь в Bash (в отличие от $SHELL, который будет содержать bash).

Если цикл for все еще дает вам проблемы, просто удалите его. Где-то в этом script мы выясним, действительно ли вы выполняете оболочку Bash или нет.

Ответ 4

Что делает

ls -l /bin/sh

на вашей машине?

Сделайте sh символическую ссылку на bash, а затем вы можете сделать sh ./test1.sh