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)