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

1

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
    
por Michael Durrant 24.01.2015 / 03:13

2 respostas

3

{1..$num_in} é um kshism / zshism. 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 chave precede a substituição de parâmetro. Então, provavelmente vem do ksh93 ou zsh, onde funciona porque a expansão de parâmetros é feita primeiro.

    
por 24.01.2015 / 03:16
1

Como {1..$num_in} não foi expandido para sequências de números, ele só foi expandido para uma string literal como {1..1} , {1..2} e assim por diante. Então, seu script realizou uma expansão aritmética, viu um número inválido e imprimiu uma mensagem de erro.

Quando você usa o seu shebang como #!/bin/sh , depende do sistema usar o shell com o qual o /bin/sh está vinculado para executar seu script. Assim, a mensagem de erro pode variar dependendo das camadas.

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 pdksh e 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

posh mesmo através de uma falha de segmentação:

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

O script funcionará com zsh e ksh93 :

$ zsh test.sh 
aaaa
aaaa
aaaa
equa to 6 6
total= 6
    
por 24.01.2015 / 03:36