На этот вопрос уже есть ответ здесь:
Я запускаю нижеприведенный скрипт:
for (( i=1; i <= 5; i++ ))
do
echo "Random number $i: $RANDOM"
done
Я получаю нижеприведенную ошибку:
Syntax error: Bad for loop variable
why this syntax is not working?
Как ответ heemayl указывает, Ваша конструкция является bashism. Стандартный способ сделать, что Вы хотите, был бы:
for i in 1 2 3 4 5
do
echo "Random number $i: $RANDOM"
done
Или, более легко расширяемо:
for i in $(seq 1 5)
do
echo "Random number $i: $RANDOM"
done
(См. man seq
для большего количества детали).
Ваш исходный сценарий имеет a (( i=1; i <= 5; i++ ))
создайте в for
цикл, который является bashism и следовательно не понимается под dash
.
В Ubuntu sh
символьная ссылка на dash
, таким образом, когда Вы работаете
sh ./script.sh
Вы являетесь в основном рабочими
dash ./script.sh
Поскольку я упомянул ранее dash
не понимает подобное C for
конструкция цикла, это показывает ошибку.
Выполнять использование сценария bash
, Вы можете:
Выполните его как как аргумент bash
например. bash script.sh
(Вы не должны делать исполняемый файл сценария),
Сделайте исполняемый файл сценария и из a bash
окружите выполненный (из каталога, содержащего сценарий):
./script.sh
Самый портативный путь состоит в том, чтобы использовать хижину (#!/bin/bash
или предпочтительно #!/usr/bin/env bash
) как первая строка Вашего сценария. Таким образом можно запустить скрипт от любой оболочки ./script.sh
, сценарий будет интерпретироваться как a bash
сценарий и следовательно будет выполняться соответственно.
Мысль я способствовал бы обсуждению немного.
было уже упомянуто, что синтаксис, используемый в Вашем сценарии, является bashism и следовательно не является портативным, даже при том, что это подобно C и хорошо понято под знакомыми с Java и C. От выяснения у моего собственного вопрос на unix.stackexchange.com, я также узнал, что синтаксис такой как for i in $(seq 1 5)
генерирует ряд чисел сначала и затем выполняет итерации, который может быть расточительным, если у Вас есть очень большой набор.
А лучший способ моделировать подобное C поведение, которое является портативным, состоит в том, чтобы использовать while
цикл с переменной, которая может быть увеличена. Например,
#!/bin/sh
number=0
while [ "$number" -lt 10 ]
do
printf "\t%d" "$number"
number=`expr $number + 1 `
done
Это работает с ударом, тире, zsh, ksh, mksh... или в основном любая оболочка, связанная с оболочкой Bourne. На самом деле у меня есть книга System V Unix с подобного 1995, и я протестировал их пример на оболочку Bourne, и это все еще работает. Поведение является также поведением подобных C для цикла: Вы имеете начальное условие, тестируя условие в while [ . . .]
, и обновляете условие в конце.
csh и tcsh имеют синтаксис ближе на язык C, но не портативный к другим оболочкам, и они не рекомендованы , чтобы использоваться в сценариях.
Дополнение :
Относительно мобильности $RANDOM, согласно эта страница на человечности Wiki, с генерацией случайных чисел тире должна полагаться на использование /dev/urandom