синтаксис цикла for в сценарии оболочки [duplicate]

На этот вопрос уже есть ответ здесь:

Я запускаю нижеприведенный скрипт:

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?

5
задан 10 May 2015 в 22:31

3 ответа

Как ответ 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 для большего количества детали).

9
ответ дан 11 May 2015 в 08:31
  • 1
    или, возможно, избавьтесь от отрицательных голосов этому. – Harsha 27 February 2017 в 01:05

Ваш исходный сценарий имеет 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 сценарий и следовательно будет выполняться соответственно.

6
ответ дан 11 May 2015 в 08:31
  • 1
    @Harsha см. meta.stackexchange.com/q/86997/135565 для получения дополнительной информации об автоматическом запрете вопроса, который, кажется, был применен к Вам. Кроме того, мы пересмотрели Ваше сообщение немного и дали ему некоторую любовь. Я на самом деле don' t понимают, почему это был downvoted так очень так или иначе... That' s все я могу в настоящее время делать для Вас. – Byte Commander♦ 27 February 2017 в 01:30

Мысль я способствовал бы обсуждению немного.

было уже упомянуто, что синтаксис, используемый в Вашем сценарии, является 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

3
ответ дан 11 May 2015 в 08:31
  • 1
    Я нуждаюсь в помощи относительно чего-то еще. Когда я ввожу в " sudo повторяют " черный список intel_powerclamp" >/etc/modprobe.d/disable-powerclamp.conf" в терминале я получаю " ' удар:/etc/modprobe.d/disable-powerclamp.conf: Разрешение denied". мне нужна причина этого. Кроме того, я должен знать, как я могу вернуться назад к включению intel_powerclamp, если мне нужен он. – Harsha 27 February 2017 в 01:58

Другие вопросы по тегам:

Похожие вопросы: