Ответ 1
Вероятно, вы запустите его с помощью sh
, а не bash
. Попробуйте bash test1.sh
или ./test1.sh
, если он выполним, но не sh test1.sh
.
У меня проблема с реализацией цикла for. Я получаю эту ошибку, когда выполняю мой script
test1.sh: 2: Ошибка синтаксиса: неверная для переменной цикла
Я не понимаю эту ошибку.
Это мой script
#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Welcome $c times..."
done
Может ли кто-нибудь сказать мне синтаксис для цикла в sh (в ubuntu он ссылается на оболочку командной строки) в ubuntu?
Вероятно, вы запустите его с помощью sh
, а не bash
. Попробуйте bash test1.sh
или ./test1.sh
, если он выполним, но не sh test1.sh
.
Стандартная оболочка POSIX принимает только синтаксис for varname in list
Синтаксис C-like for-loop for (( expr1; expr2; expr3 ))
является багизмом.
Вы можете получить подобное поведение в стандартной оболочке POSIX, используя for c in $(seq 1 5)
Ваша оболочка script (как показано) работает как в оболочке Korn, так и в Bash. Некоторые мысли:
syntax error: '(' unexpected
).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 или нет.
Что делает
ls -l /bin/sh
на вашей машине?
Сделайте sh
символическую ссылку на bash
, а затем вы можете сделать sh ./test1.sh