Почему я получаю
./6_sum_square_difference.sh: 11: ./6_sum_square_difference.sh: Illegal number: {1..3}
для
#!/bin/sh
summing () {
the_total=0
num_in=$1
for one_num in {1..$num_in}
do
printf "aaaa\n"
the_total=$((the_total+one_num)) # <-- Line 11
done
}
summing 3
if [[ $the_total == 6 ]]; then
echo "equa to 6 "$the_total
else
echo "NOT equal to 6"
fi
printf "total= "$the_total
решение1
{1..$num_in}
это кшизм/зшизм. Вы должны написать:
`seq $num_in`
Примечание: Хотя bash поддерживает код типа {1..3}
, как сказал 1_CR в комментарии, {1..$num_in}
не работает в bash из-за того, что раскрытие скобок предшествует подстановке параметров. Так что, вероятно, это пришло из ksh93 или zsh, где это работает, потому что сначала выполняется раскрытие параметров.
решение2
Поскольку {1..$num_in}
не расширяется до последовательностей чисел, он расширяется только до строкового литерала, например {1..1}
, {1..2}
и т. д. Итак, ваш скрипт выполнил арифметическое расширение, увидел недопустимое число и вывел сообщение об ошибке.
Когда вы используете ваш shebang как #!/bin/sh
, это зависит от системы, которая использует оболочку, /bin/sh
связанную с запуском вашего скрипта. Таким образом, сообщение об ошибке может различаться в зависимости от оболочек.
С dash
:
$ dash test.sh
aaaa
test.sh: 74: test.sh: Illegal number: {1..3}
С bash
:
$ bash test.sh
aaaa
test.sh: line 74: {1..3}: syntax error: operand expected (error token is "{1..3}")
NOT equal to 6
total= 0
С pdksh
и mksh
:
$ pdksh test.sh
aaaa
test.sh[77]: {1..3}: unexpected '{'
NOT equal to 6
total= 0
С yash
:
$ yash test.sh
aaaa
yash: arithmetic: `{1..3}' is not a valid number
posh
даже через ошибку сегментации:
$ posh test.sh
aaaa
test.sh:77: {1..3}: unexpected `{'
Segmentation fault
Скрипт будет работать с zsh
и ksh93
:
$ zsh test.sh
aaaa
aaaa
aaaa
equa to 6 6
total= 6