¿Por qué obtengo un número ilegal: {1..3}

¿Por qué obtengo un número ilegal: {1..3}

¿Por qué estoy recibiendo

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

Respuesta1

{1..$num_in}es un kshism/zshism. Deberías escribir:

`seq $num_in`

Nota: Aunque bash admite código como {1..3}, como dijo 1_CR en el comentario, {1..$num_in}no funciona en bash, debido al hecho de que la expansión de llaves precede a la sustitución de parámetros. Entonces, probablemente proviene de ksh93 o zsh, donde funciona porque la expansión de parámetros se realiza primero.

Respuesta2

Debido a que {1..$num_in}no se expandió a secuencias de números, solo se expandió a cadenas literales como {1..1}, {1..2}etc. Entonces, su secuencia de comandos realizó una expansión aritmética, vio un número no válido e imprimió un mensaje de error.

Cuando usa su shebang como #!/bin/sh, depende del sistema para usar a qué shell /bin/shestá vinculado para ejecutar su secuencia de comandos. Por tanto, el mensaje de error puede variar según los shells.

Con dash:

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

Con 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

Con pdkshy mksh:

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

Con yash:

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

poshincluso a través de una falla de segmentación:

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

El script funcionará con zshy ksh93:

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

información relacionada