синтаксис цикла for в сценариях оболочки Linux - PullRequest
18 голосов
/ 12 апреля 2011

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

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

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 12 апреля 2011

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

5 голосов
/ 12 апреля 2011

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

С-синтаксис for-loop for (( expr1; expr2; expr3 )) - это башизм.

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

1 голос
/ 12 апреля 2011

Что дает

ls -l /bin/sh

на вашем компьютере?

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

1 голос
/ 12 апреля 2011

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

  • Вам может понадобиться пробел после шебанга (#! / 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 все еще вызывает проблемы, простоудали это.Где-то в этом сценарии мы узнаем, действительно ли вы запускаете оболочку bash или нет.

...