2011-04-11 20 views
16

Tengo un problema al implementar un bucle for. Obtengo este error cuando ejecuto mi scriptsintaxis de bucle for en scripts de shell de linux

test1.sh: 2: Syntax error: Bad for loop variable

No entiendo este error.

Ésta es mi guión

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

Puede alguien decirme sintaxis de bucle de SH (en ubuntu se une a lanzarse cáscara) Shell en Ubuntu?

+1

no consigo el mismo error que por que - consigo final de archivo inesperado. De todos modos, te falta un punto y coma. –

+1

Eso me funciona. Probablemente tengas un personaje extraño escondido en el texto. – karlphillip

+0

Para bash, la sintaxis parece estar bien. ¿Puedes intentar asegurarte de que estás ejecutando el caparazón correcto? 'ls -l/bin/bash', tal vez? –

Respuesta

31

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

+0

Funciona bien en bash como se muestra actualmente en la publicación –

+0

Krelin: Tienes razón. Lo ejecuté usando sh en lugar de bash o "./". Funciona bien ahora. Gracias – mkab

+0

Sí funciona bien en bash. Hacer sh punto a bash (enlace simbólico)! – abc

0

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

  • Es posible que necesite un espacio después del shebang (#!/Bin/bash y no #!/Bin/bash). Sin embargo, Dennis Ritchie había especificado originalmente el espacio es opcional. Además, no es el error que obtiene con el shell Bourne (en su lugar, obtiene syntax error: '(' unexpected).
  • ¿Está en un sistema Windows? Solo una puñalada en la oscuridad. Esto no parece un error de Windows.
  • ¿Este es el sistema Solaris o HP/UX? Puede 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 el constructo 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 
  • El set -xv mostrará todas las líneas a medida que se ejecutan.
  • El $RANDOM debe mostrar un valor si esto es BASH o Kornshell (su bucle for funcionará en cualquiera de los dos).
  • El {$BASH_VERINFO[x]} solo debe configurarse si esto es realmente BASH. Estos ni siquiera se configuran incluso si ejecuta el shell Korn después de estar en BASH (a diferencia de $ SHELL, que todavía contendrá bash).

Si el bucle for aún le da problemas, simplemente elimínelo. En algún lugar de este script, descubriremos si realmente estás ejecutando un shell bash o no.

5

Un shell POSIX estándar sólo acepta la sintaxis for varname in list

El C-como para-loop sintaxis for ((expr1; expr2; expr3)) es una del bash.

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

0

¿Qué

ls -l /bin/sh 

dan en su máquina?

Hacer sh un enlace simbólico a bash y entonces usted puede hacer sh ./test1.sh