GNU/Linux >> Tutoriales Linux >  >> Linux

Condición if/else de una línea en scripts de shell de Linux

Para resumir las otras respuestas, para uso general:

Multilínea si...entonces declaración

if [ foo ]; then
    a; b
elif [ bar ]; then
    c; d
else
    e; f
fi

Versión de una sola línea

if [ foo ]; then a && b; elif [ bar ]; c && d; else e && f; fi

Uso del operador OR

( foo && a && b ) || ( bar && c && d ) || e && f;

Notas

Recuerde que los operadores AND y OR evalúan si el código de resultado de la operación anterior fue o no igual a verdadero/éxito (0 ). Entonces, si una función personalizada devuelve algo más (o nada en absoluto), puede tener problemas con la abreviatura AND/OR. En tales casos, es posible que desee reemplazar algo como ( a && b ) con ( [ a == 'EXPECTEDRESULT' ] && b ) , etc.

También tenga en cuenta que ( y [ son comandos técnicamente, por lo que se requieren espacios en blanco alrededor de ellos.

En lugar de un grupo de && declaraciones como then a && b; else , también podría ejecutar declaraciones en una subcapa como then $( a; b ); else , aunque esto es menos eficiente. Lo mismo es cierto para hacer algo como result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] en lugar de ( foo && a && b ) || ( bar && c && d ) . Aunque en ese punto, de todos modos, te estarías metiendo más en cosas menos compactas y de varias líneas.


Parece como si estuvieras en el camino correcto. Solo necesita agregar la declaración else después de ";" después de la declaración "entonces". También dividiría la primera línea de la segunda línea con un punto y coma en lugar de unirla con "&&".

maxline='cat journald.conf | grep "#SystemMaxUse="'; if [ $maxline == "#SystemMaxUse=" ]; then sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2 && mv journald.conf2 journald.conf; else echo "This file has been edited. You'll need to do it manually."; fi

También en su secuencia de comandos original, al declarar maxline usó comillas invertidas "`" en lugar de comillas simples "'", lo que podría causar problemas.


No es una respuesta directa a la pregunta, pero podría usar el operador OR

( grep "#SystemMaxUse=" journald.conf > /dev/null && sed -i 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf ) || echo "This file has been edited. You'll need to do it manually."

Linux
  1. Alias ​​de línea de comandos en el shell de Linux

  2. ¿Cómo analizar Json con secuencias de comandos de Shell en Linux?

  3. ¿Verificación de condición de una línea en Makefile?

  4. ¿Cómo enumero un nombre de archivo por línea de salida en Linux?

  5. ¿Qué pasa con linux/if.h y net/if.h?

25 Preguntas y respuestas de la entrevista de secuencias de comandos de Linux Shell

Shell Scripting Parte I:Primeros pasos con bash scripting

Libro electrónico gratuito de Packt - Linux Shell Scripting Cookbook - Tercera edición

Shell Scripting para principiantes:cómo escribir Bash Scripts en Linux

¿Qué es Shebang en Linux Shell Scripting?

Bash Scripting:cómo generar y formatear texto en Linux Shell