script one loop for done linux bash shell for-loop dash

one - sintaxis de for loop en linux shell scripting



foreach bash (4)

Tengo un problema implementando un bucle for. Recibo este error cuando ejecuto mi script

test1.sh: 2: Error de sintaxis: malo 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

¿Puede alguien decirme la sintaxis para for loop in sh (en ubuntu se vincula al shell del dash) shell en ubuntu?


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


Que hace

ls -l /bin/sh

dar en tu maquina?

Haz de sh un enlace simbólico para bash y luego puedes hacer sh ./test1.sh


Su script de shell (como se muestra) se ejecuta tanto en el 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 originalmente había especificado que el espacio es opcional . Además, no es el error que se obtiene con el shell Bourne (aparece un error de syntax error: ''('' unexpected lugar).
  • ¿Estás en un sistema de 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

  • El 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 configurarse si esto es realmente BASH. Estos ni siquiera se configuran incluso si ejecutas el shell Korn después de que estés en BASH (a diferencia de $ SHELL, que todavía contendrá bash ).

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


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

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

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