Warum erhalte ich die Meldung „Unzulässige Nummer: {1..3}“

Warum erhalte ich die Meldung „Unzulässige Nummer: {1..3}“

Warum bekomme ich

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

für

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

Antwort1

{1..$num_in}ist ein Kshismus/Zshismus. Sie sollten schreiben:

`seq $num_in`

Hinweis: Obwohl Bash Code wie unterstützt {1..3}, funktioniert dieser, wie von 1_CR im Kommentar angegeben, {1..$num_in}in Bash nicht, da die Klammererweiterung der Parameterersetzung vorausgeht. Es stammt also wahrscheinlich von KSH93 oder ZSH, wo es funktioniert, weil die Parametererweiterung zuerst erfolgt.

Antwort2

Denn {1..$num_in}es wurde nicht in Zahlenfolgen erweitert, sondern nur in wörtliche Zeichenfolgen wie {1..1}usw. {1..2}Ihr Skript hat also eine arithmetische Erweiterung durchgeführt, eine ungültige Zahl erkannt und eine Fehlermeldung ausgegeben.

Wenn Sie Ihren Shebang als verwenden #!/bin/sh, hängt es vom System ab, welche Shell /bin/shzum Ausführen Ihres Skripts verwendet wird. Daher kann die Fehlermeldung je nach Shell unterschiedlich ausfallen.

Mit dash:

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

Mit 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

Mit pdkshund mksh:

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

Mit yash:

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

poshsogar durch einen Segmentierungsfehler:

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

Das Skript funktioniert mit zshund ksh93:

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

verwandte Informationen