Respuestas:
Creo que file.sh está con terminadores de línea CRLF.
correr
dos2unix file.sh
entonces el problema se solucionará.
Puede instalar dos2unix en ubuntu con esto:
sudo apt-get install dos2unix
Otra cosa para verificar (se me acaba de ocurrir):
Es decir, este fragmento de aspecto inocente provocará el mismo error:
die () { test -n "$@" && echo "$@"; exit 1 }
Para hacer feliz al analizador tonto:
die () { test -n "$@" && echo "$@"; exit 1; }
;
que se espera que la instrucción Every termine con, ;
por lo que al final, por ejemplo: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
producirá ese error, mientras if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
que no ... notará los pequeños puntos y coma al final, es decir, después de .bash
y fi
.
zsh
usuario. El primero funciona en zsh
pero no en sh
ni bash
. Ojalá fuera 4 personas para poder dar estos 4 votos a favor
También acabo de recibir este mensaje de error al usar la sintaxis incorrecta en una if
cláusula
else if
(error de sintaxis: final inesperado del archivo) elif
(sintaxis correcta)lo depuré comentando bits hasta que funcionó
una cláusula if => fi no cerrada también aumentará esto
consejo: use trap para depurar, si su script es enorme ...
p.ej
set -x
trap read debug
unexpected end of file
error se producirá tan pronto como fi
se golpee.
Obtuve esta respuesta de este problema similar en StackOverflow
Abra el archivo en Vim e intente
:set fileformat=unix
Convierta los finales de línea eh a finales de Unix y vea si eso resuelve el problema. Si edita en Vim, ingrese el comando: set fileformat = unix y guarde el archivo. Varios otros editores tienen la capacidad de convertir finales de línea, como Notepad ++ o Atom
Gracias @lemongrassnginger
dos2unix
que aconseja la respuesta aceptada.
Así que encontré esta publicación y las respuestas no me ayudaron, pero pude averiguar por qué me dio el error. Tuve un
cat > temp.txt < EOF
some content
EOF
El problema fue que copié el código anterior para que estuviera en una función y, sin darme cuenta, puse el código en una pestaña. Necesito asegurarse de que el último EOF no esté marcado con pestañas.
EOF
sangrado cuatro espacios y bash no lo analizó por eso. Eliminar espacios solucionó el problema.
Esto me estaba sucediendo cuando intentaba llamar a una función usando parens, por ejemplo
run() {
echo hello
}
run()
debiera ser:
run() {
echo hello
}
run
PARA VENTANAS:
En mi caso, estaba trabajando en el sistema operativo Windows y recibí el mismo error mientras ejecutaba autoconf.
Luego convertí el archivo con conversión EOL a Windows (CR LF) de la siguiente manera:
EDITAR -> CONVERSIÓN EOL -> WINDOWS (CR LF)
Pude cortar y pegar su código en un archivo y se ejecutó correctamente. Si lo ejecuta así, debería funcionar:
Su "file.sh":
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
El comando:
$ ./file.sh arg1 arg2 arg3
Tenga en cuenta que "file.sh" debe ser ejecutable:
$ chmod +x file.sh
Es posible que obtenga ese error b / c de cómo está haciendo la entrada (con una tubería, zanahoria, etc.). También puede intentar dividir la condición en dos:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
O, ya que está usando bash
, puede usar la sintaxis incorporada:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Y, finalmente, por supuesto, puede verificar si se dieron 3 argumentos (limpio, mantiene la compatibilidad con el shell POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Acabo de cortar y pegar su ejemplo en un archivo; funcionó bien bajo bash. No veo ningún problema con eso.
En buena medida, es posible que desee asegurarse de que termine con una nueva línea, aunque a bash no debería importarle. (Se ejecuta para mí con y sin la nueva línea final).
A veces, verá errores extraños si ha incrustado accidentalmente un carácter de control en el archivo. Dado que es un script corto, intente crear un nuevo script pegándolo de su pregunta aquí en StackOverflow, o simplemente volviendo a escribirlo.
¿Qué versión de bash estás usando? ( bash --version
)
¡Buena suerte!
Asegúrese de que el nombre del directorio en el que está presente el archivo .sh no tenga un carácter de espacio. Por ejemplo: digamos que si está en una carpeta llamada 'Nueva carpeta', seguramente encontrará el error que ha citado. En su lugar, simplemente nómbrelo como 'New_Folder'. Espero que esto ayude.
Sé que llegué tarde a la fiesta. Espero que esto pueda ayudar a alguien.
Verifique su archivo .bashrc. Quizás cambiarle el nombre o moverlo.
Discusión aquí: no se puede obtener un script bash simple
La falta de una llave de cierre en la definición de una función causará este error como acabo de descubrir.
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
Que por supuesto debería ser así ...
function whoIsAnIidiot() {
echo "not you for sure"
}
En mi caso, hay un redundante \
de la siguiente manera:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
Hay NO una \
al final deDATA.PATH_PREFIX ./afs/kinetics400