¿Cómo puedo hacer algo así en bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
¿Cómo puedo hacer algo así en bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Respuestas:
Cómo hacer algo condicionalmente si un comando tuvo éxito o falló
Eso es exactamente lo if
que hace la declaración de bash :
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Agregar información de los comentarios: no necesita utilizar la sintaxis [
... ]
en este caso. [
es en sí un comando, casi equivalente a test
. Es probablemente el comando más común para usar en un if
, lo que puede llevar a suponer que es parte de la sintaxis del shell. Pero si desea probar si un comando tuvo éxito o no, use el comando directamente con if
, como se muestra arriba.
Editar: Citó la pregunta en la parte superior para mayor claridad (esta respuesta no aparece cerca de la parte superior de la página).
then
en una línea separada.
if ! command ; then ... ; fi
. [
es en sí mismo un comando, y no es necesario en este caso.
if [ ! command ]
no se ejecuta command
; lo trata command
como una cadena y lo trata como verdadero porque tiene una longitud distinta de cero. [
es un sinónimo del test
comando
Para cosas pequeñas que desea que sucedan si un comando de shell funciona, puede usar la &&
construcción:
rm -rf somedir && trace_output "Removed the directory"
De manera similar, para cosas pequeñas que desea que sucedan cuando falla un comando de shell, puede usar ||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
O ambos
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
Probablemente no sea prudente hacer mucho con estas construcciones, pero en ocasiones pueden hacer que el control sea mucho más claro.
Verifique el valor de $?
, que contiene el resultado de ejecutar el comando / función más reciente:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
if
lenguaje de Bash . Prefiero la respuesta de Keith Thompson.
if
es hacer esto. Todas las condiciones de control de flujo en Bash examinan $?
detrás de escena; Eso es lo que hacen. Examinar explícitamente su valor debería ser innecesario en la gran mayoría de los casos, y generalmente es un antipatrón para principiantes.
if ! cmd
está bien. De lo contrario, una disposición común es utilizar una else
cláusula. No puede tener un espacio vacío, then
pero a veces puede ver then : nothing; else
dónde el :
no-op es significativo. true
funcionaría allí también.
Esto funcionó para mí:
command && echo "OK" || echo "NOK"
si command
tiene éxito, entonces echo "OK"
se ejecuta, y dado que tiene éxito, la ejecución se detiene allí. De lo contrario, &&
se omite y echo "NOK"
se ejecuta.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?
echo "OK"
parte podría fallar, entonces esto es mejor:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Cabe señalar que if...then...fi
y &&
/ ||
tipo de enfoque trata con el estado de salida devuelto por el comando que queremos probar (0 en caso de éxito); sin embargo, algunos comandos no devuelven un estado de salida distinto de cero si el comando falló o no pudo manejar la entrada. Esto significa que los enfoques habituales if
y &&
/ ||
no funcionarán para esos comandos en particular.
Por ejemplo, en Linux, GNU file
todavía sale con 0 si recibió un archivo no existente como argumento y find
no pudo ubicar el archivo especificado por el usuario.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
En tales casos, una forma potencial de manejar la situación es mediante la lectura stderr
/ stdin
mensajes, por ejemplo, aquellos que regresaron por file
comando, o analizar la salida del comando como en find
. Para ese propósito, se case
podría usar una declaración.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
El más propenso a errores que pude encontrar fue:
RR=$?
Ahora, no solo por esta situación, sino por otras que pueda enfrentar, considere:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Respuesta: sí
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Respuesta: no
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Respuesta: no
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Respuesta: sí
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Respuesta: sí
Esto evita todo tipo de errores.
Probablemente conozca toda la sintaxis, pero aquí hay algunos consejos:
"blank"
ser nothing
.${variable}
.base-8
. Recibirá un error como:
value too great for base (error token is "08")
para los números de arriba 7
. Es entonces cuando 10#
entra en juego:10#
obliga al número a ser base-10
.Puedes hacerlo:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
ping
se captura en vista de ejecutarlo como un comando. Pero debido a que la salida se redirige a / dev / null, esa siempre será la cadena vacía. Por lo tanto, no está ejecutando nada en una subshell, lo que significa que se mantendrá el estado de salida anterior (de la subshell de sustitución de comandos, que es de ping). Obviamente, la forma correcta es if ping ...; then
aquí.
Como se señaló en otra parte de este hilo, la pregunta original básicamente se responde a sí misma. Aquí hay una ilustración que muestra que las if
condiciones también pueden estar anidadas.
Este ejemplo se utiliza if
para verificar si existe un archivo y si es un archivo normal. Si esas condiciones son verdaderas, compruebe si tiene o no un tamaño mayor que 0.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
Esto podría hacerse simplemente de esta manera, ya que $?
le da el estado del último comando ejecutado.
Entonces podría ser
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi