Почему я получаю Незаконный номер: {1..3}

Почему я получаю Незаконный номер: {1..3}

Почему я получаю

./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

Связанный контент