Estaba hojeando un /etc/rc.d/init.d/sendmail
archivo (sé que esto casi nunca se usa, pero estoy estudiando para un examen), y estoy un poco confundido sobre &&
los ||
operadores y los operadores. He leído dónde se pueden usar en declaraciones como:
if [ test1 ] && [ test2 ]; then
echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
echo "one test is true"
fi
Sin embargo, este script muestra declaraciones de una sola línea como:
[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0
Estos parecen estar utilizando los operadores &&
y ||
para obtener respuestas basadas en pruebas, pero no he podido desenterrar documentación sobre este uso particular de estos operadores. ¿Alguien puede explicar lo que hacen en este contexto particular?
fuente
[ ... ]
que es un programa", en muchos casos lo es . Es comúnmente en el archivo/bin/[
o/usr/bin/[
.test
lugar deif
o[
. Yif [
yif test
parecen estar intercalados con[
ytest
sin rima ni razón aparente.test
aparece ocasionalmente, como en config.site para bibliotecas de proveedores en Fedora x86_64 .Aquí está mi hoja de trucos:
fuente
(a => b => a)
. "derecho (también conocido como falso)":(a => b => b)
. "A; B" "entonces"(a => b => (() => b())(a()))
. "A y B" "si no hay otra cosa (cuando)"(a => b => a()(() => right)(b))
. "A || B" "más sin if (a menos que)"(a => b => a()(b)(() => right))
. "a && b || c" "ifThenElse"(a => b => c => (unless(when(a)(b))(c))())
.expandir la respuesta de @ Shawn-j-Goff desde arriba,
&&
es un AND lógico y||
es un OR lógico.Consulte esta parte de la Guía avanzada de secuencias de comandos Bash. Algunos de los contenidos del enlace para referencia del usuario como a continuación.
&& AND
|| O
fuente
Desde mi experiencia, uso el && y || para reducir una declaración if a una sola línea.
Digamos que estamos buscando un archivo llamado /root/Sample.txt, entonces la iteración tradicional sería la siguiente en el shell:
Estas 6 líneas se pueden reducir a una sola línea:
Cuando se ejecutan algunas iteraciones para establecer variables o crear archivos, etc., la vida es más fácil y la secuencia de comandos se ve más elegante usando la línea única si funciona, su único inconveniente es que se vuelve un poco más difícil implementar múltiples comandos desde una sola iteración. Puedes hacer uso de las funciones.
fuente
./someScript.sh & && echo 'ok' || echo 'ko'
Hay una noción de "atajo".
Cuando
(expr1 && expr2)
se evalúa:expr2
solo se evalúa si seexp1
evalúa como "verdadero". Esto es porque ambosexpr1
Yexpr2
tienen que ser verdad para(expr1 && expr2)
ser verdad. Si seexpr1
evalúa como "falso"expr2
NO se evalúa (atajo) porque(expr1 && expr2)
ya está "plano"Pruebe lo siguiente: suponga que el archivo
F1
existe y que el archivoF2
no existe:De manera similar para
||
(o), pero se invierte el atajo.fuente
Los ejemplos en la respuesta de Shawn J. Goff son correctos, pero la explicación es al revés. Por favor, compruebe:
fuente
&&
resultados en toda la expresión devuelve falso ?