syntax - script - ¿Cómo puedo dividir un comando de shell en varias líneas al usar una instrucción IF?
scripts bash ejemplos (2)
La continuación de la línea fallará si tiene espacios en blanco (espacios o caracteres de tabulación) después de la barra invertida y antes de la nueva línea. Sin ese espacio en blanco, su ejemplo funciona bien para mí:
$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py /
--forward-agent /
--disable-known-hosts deploy:$target; then
echo failed
else
echo succeeded
fi
$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed
Algunos detalles promovidos de los comentarios: la barra diagonal inversa de continuación de línea en el shell no es un caso especial; es simplemente un ejemplo de la regla general de que una barra invertida hace que el siguiente carácter sea literal, evitando cualquier efecto especial que pueda tener. En este caso, el siguiente carácter es una nueva línea, y el efecto especial que se evita es terminar la línea de comando. Al igual que con todos los demás escapes de barra invertida, no puede haber nada entre la barra invertida y el carácter que está citando. Si el siguiente carácter después de la barra diagonal inversa es un espacio o una pestaña, solo obtiene un espacio literal o una pestaña, y no hay ningún efecto en la nueva línea posterior, que aún termina el comando como de costumbre.
¿Cómo puedo dividir un comando en varias líneas en el shell, cuando el comando es parte de una instrucción if
?
Esto funciona:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Esto no funciona:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py /
--forward-agent /
--disable-known-hosts deploy:$target; then
rc=1
fi
En lugar de ejecutar todo el comando, obtengo:
./script.sh: line 73: --forward-agent: command not found
Más importante aún, ¿qué falta en mi comprensión de Bash que me ayudará a entender esto y otros problemas similares en el futuro?
Para usuarios de Windows / Cygwin / WSL etc:
Asegúrese también de que los finales de sus líneas sean líneas estándar de Unix, es decir, /n
(LF) solamente. Tener Windows /r/n
(CRLF) los finales de línea lo romperá.