it-swarm-es.tech

sintaxis de for loop en scripts de Linux Shell

Tengo un problema al implementar un bucle for. Me sale este error cuando ejecuto mi script

test1.sh: 2: error de sintaxis: incorrecto para la variable de bucle

No entiendo este error.

Este es mi guion

#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Welcome $c times..."
done

¿Alguien puede decirme la sintaxis para for loop in sh (en ubuntu se enlaza con dash Shell) Shell en ubuntu?

18
mkab

Probablemente lo ejecute con sh, no bash. Tratar bash test1.sh o ./test1.sh si es ejecutable, pero no sh test1.sh.

36

Un shell POSIX estándar solo acepta la sintaxis for varname in list

La sintaxis de bucle for similar a C for (( expr1; expr2; expr3 )) es un bashismo.

Puede obtener un comportamiento similar en el shell POSIX estándar utilizando for c in $(seq 1 5)

5
Ken Bloom

Su script de Shell (como se muestra) se ejecuta tanto en Korn Shell como en Bash. Algunos pensamientos:

  • Es posible que necesite un espacio después de Shebang (#!/Bin/bash y no #!/Bin/bash). Sin embargo, Dennis Ritchie había especificado originalmente que el espacio es opcional . Además, no es el error que obtienes con Bourne Shell (obtienes syntax error: '(' unexpected en su lugar).
  • ¿Estás en un sistema Windows? Solo una puñalada en la oscuridad. Esto no parece un error de Windows.
  • ¿Es este sistema Solaris o HP/UX? Es posible que no estén ejecutando versiones verdaderas de Bash, o tal vez una versión anterior. Sin embargo, incluso la versión más antigua de Bash reconoce la construcción for ((x;y;z)).

Prueba esto:

#! /bin/bash
set -vx
echo "Random = $RANDOM"   #Test for bash/Kornshell. Will be blank in other shells
echo \$BASH_VERSINFO[0] = ${BASH_VERSINFO[0]} #Should only work in BASH
echo \$BASH_VERSINFO[1] = ${BASH_VERSINFO[1]}
echo \$BASH_VERSINFO[2] = ${BASH_VERSINFO[2]}
echo \$BASH_VERSINFO[3] = ${BASH_VERSINFO[3]}
echo \$BASH_VERSINFO[4] = ${BASH_VERSINFO[4]}
echo \$BASH_VERSINFO[5] = ${BASH_VERSINFO[5]}
for ((c=0, c<=5, c++))
do
    echo "Welcome $c times"
done
  • set -xv Mostrará todas las líneas a medida que se ejecutan.
  • El $RANDOM Debería mostrar un valor si es BASH o Kornshell (su bucle for funcionará en cualquiera de los dos).
  • El {$BASH_VERINFO[x]} Solo debe establecerse si esto es realmente BASH. Estos ni siquiera se configuran incluso si ejecuta Korn Shell después de estar en BASH (a diferencia de $ Shell, que todavía contendrá bash).

Si el bucle for todavía te causa problemas, simplemente bórralo En algún lugar de este script, descubriremos si realmente está ejecutando un bash Shell o no.

1
David W.

Que hace

ls -l /bin/sh

dar en su máquina?

Haga sh un enlace simbólico a bash y luego puede hacer sh ./test1.sh

1
abc