2015-10-16 2 views
0

Я не знаю, правильно ли я правильно сформулировал предложение в сценарии оболочки. Это то, что я пытаюсь сделатьПроблемы с предложением for (shell script)

#!/bin/bash 

echo Shows the numbers from 1 to 100 and their squares 
echo 

i=1 

for ((i = 1; i <= 100; i++)); do 
    exp= `expr $i \* $i` 
    echo "N: $i EXP: $exp" 
done 

И это показывает: «ошибка синтаксиса: Плохо для переменного цикла»

+0

Я надеваю 't получить ту же ошибку: я вижу 'bash: 1: команда не найдена',' bash: 4: команда не найдена', 'bash: 9: команда не найдена' и т. д., до' 10000: команда не найдена' - Какую версию bash вы используете? –

+0

... теперь, вы * do * должны избавиться от пространства в присваивании 'exp =', или, лучше, замените его на нативную математику: 'exp = $ ((i * i))' –

ответ

1

Как вы используете этот сценарий?

Вы используете /bin/sh scriptfile.sh вместо /bin/bash scriptfile.sh или /path/to/scriptfile.sh?

Потому что это выглядит как ошибка dash, потому что тире не поддерживает арифметику для синтаксиса цикла.

+0

Что делать ты имеешь в виду? Я выполняю это в моем терминале как «sh scripfile.sh» – Telefang

+2

Да, 'sh' не' bash'. В вашем скрипте используется 'bash'/etc. функции. Попробуйте 'bash scriptfile.sh', и он должен работать. Как и './Scriptfile.sh' (и т. Д.), Как только вы дадите свои исполняемые разрешения для сценария (из-за вашей строки' #!/Bin/bash' shebang вверху). –

+0

О, верно! Я этого не заметил. Он работает сейчас! Благодаря! – Telefang

2

Если вы сделали скрипт исполняемым: chmod u+x script.sh и вы вызываете его как:

$ ./script.sh 

скрипт будет загружать Баш как интерпретатор сценария.
Если вы используете что-то вроде: sh script.sh, то может быть, что ваша используемая оболочка - это что-то еще, например, тире, ksh, zsh или какой-либо другой набор в качестве оболочки, связанной с ссылкой на файл/bin/sh.

Проверьте, что Bash является исполняющей оболочкой. Если еще в задачах:

пространства после = интерпретируется оболочкой как новое слово, которое будет выполняться.
Поэтому попытка выполнить команду с именем 4, 9 or 16, etc. вызовет ошибку command not found.

Это не будет работать (нет необходимости использовать i=1, как он установлен на для начала):

#!/bin/bash 
echo "Shows the numbers from 1 to 100 and their squares" 
echo 
for ((i=1; i<=100; i++)); do 
    exp=`expr $i \* $i` 
    echo "N: $i EXP: $exp" 
done 

Но на самом деле, в Баш, это будет более идиоматических:

#!/bin/bash 
echo -e "Shows the numbers from 1 to 100 and their squares\n" 
for ((i=1; i<=100; i++)); do 
    echo "N: $i EXP: $((i**2))" 
done 
+0

Я не согласен, что '{1..10}' более идиоматично; его часто избегают (я рассуждаю разумно) из-за его неспособности использовать результаты расширения для значений начала/конца. –

+0

@CharlesDuffy То, что я хотел быть более идиоматичным, это '$ ((i ** 2))'. Но я рад согласиться с вами в отношении '{1..10}'. Изменено уже. –