¿Cómo puedo hacer algo así en bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michael Mrozek
fuente
fuente
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 ejecutacommand
; lo tratacommand
como una cadena y lo trata como verdadero porque tiene una longitud distinta de cero.[
es un sinónimo deltest
comandoPara cosas pequeñas que desea que sucedan si un comando de shell funciona, puede usar la
&&
construcción:De manera similar, para cosas pequeñas que desea que sucedan cuando falla un comando de shell, puede usar
||
:O ambos
Probablemente no sea prudente hacer mucho con estas construcciones, pero en ocasiones pueden hacer que el control sea mucho más claro.
fuente
Verifique el valor de
$?
, que contiene el resultado de ejecutar el comando / función más reciente:fuente
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 unaelse
cláusula. No puede tener un espacio vacío,then
pero a veces puede verthen : nothing; else
dónde el:
no-op es significativo.true
funcionaría allí también.Esto funcionó para mí:
si
command
tiene éxito, entoncesecho "OK"
se ejecuta, y dado que tiene éxito, la ejecución se detiene allí. De lo contrario,&&
se omite yecho "NOK"
se ejecuta.fuente
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 habitualesif
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 yfind
no pudo ubicar el archivo especificado por el usuario.En tales casos, una forma potencial de manejar la situación es mediante la lectura
stderr
/stdin
mensajes, por ejemplo, aquellos que regresaron porfile
comando, o analizar la salida del comando como enfind
. Para ese propósito, secase
podría usar una declaración.fuente
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:
variable definida:
$ 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
variable indefinida:
$ 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"
sernothing
.${variable}
.base-8
. Recibirá un error como:value too great for base (error token is "08")
para los números de arriba7
. Es entonces cuando10#
entra en juego:10#
obliga al número a serbase-10
.fuente
Puedes hacerlo:
fuente
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 esif 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.fuente
fuente
Esto podría hacerse simplemente de esta manera, ya que
$?
le da el estado del último comando ejecutado.Entonces podría ser
fuente