Por que recebo um número ilegal: {1..3}

Por que recebo um número ilegal: {1..3}

Por que estou recebendo

./6_sum_square_difference.sh: 11: ./6_sum_square_difference.sh: Illegal number: {1..3}

para

#!/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

Responder1

{1..$num_in}é um kshismo/zshismo. Você deve escrever:

`seq $num_in`

Nota: Embora o bash suporte código como {1..3}, como dito por 1_CR no comentário, {1..$num_in}não funciona no bash, devido ao fato de que a expansão de chaves precede a substituição de parâmetros. Então, provavelmente vem do ksh93 ou zsh, onde funciona porque a expansão dos parâmetros é feita primeiro.

Responder2

Como {1..$num_in}não foi expandido para sequências de números, ele foi expandido apenas para strings literais como {1..1}e {1..2}assim por diante. Portanto, seu script executou expansão aritmética, viu um número inválido e imprimiu uma mensagem de erro.

Quando você usa seu shebang como #!/bin/sh, depende do sistema usar o shell /bin/shvinculado para executar seu script. Assim, a mensagem de erro pode variar dependendo dos shells.

Com dash:

$ dash test.sh 
aaaa
test.sh: 74: test.sh: Illegal number: {1..3}

Com 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

Com pdkshe mksh:

$ pdksh test.sh 
aaaa
test.sh[77]: {1..3}: unexpected '{'
NOT equal to 6
total= 0

Com yash:

$ yash test.sh 
aaaa
yash: arithmetic: `{1..3}' is not a valid number

poshmesmo através de uma falha de segmentação:

$ posh test.sh 
aaaa
test.sh:77: {1..3}: unexpected `{'
Segmentation fault

O script funcionará com zshe ksh93:

$ zsh test.sh 
aaaa
aaaa
aaaa
equa to 6 6
total= 6

informação relacionada