while script one ejemplos conditionals linux shell if-statement

one - Una línea si/else condiciona en linux shell scripting



shell script linux if condition (3)

No es una respuesta directa a la pregunta, pero puede 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."

Me gustaría tener el equivalente de lo siguiente en una línea si / else condiciona.

$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

Estoy tratando de poner esto en un comando de una línea. Hasta ahora lo he recibido todo, pero la otra parte de la orden. Esto es lo que tengo hasta ahora ...

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; fi

Entonces, ¿cómo puedo incluir la otra parte del código anterior en mi comando? De forma anticipada, muchas gracias por su ayuda.


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

Usando el 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 / exitoso ( 0 ). Por lo tanto, si una función personalizada devuelve algo más (o nada en absoluto), es posible que tenga 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écnicos, por lo que se requieren espacios en blanco alrededor de ellos.

En lugar de un grupo de declaraciones && como then a && b; else then a && b; else , también puede ejecutar sentencias en una subshell como then $( a; b ); else 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" ] result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] lugar de ( foo && a && b ) || ( bar && c && d ) ( foo && a && b ) || ( bar && c && d ) . Aunque en ese punto, de todos modos, estarías metiéndote más en cosas de líneas múltiples y menos compactas.


Parece como si estuvieras en el camino correcto. Solo necesita agregar la sentencia else después de ";" siguiendo 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, utilizó "tilde" en lugar de comillas simples "" que podrían causar problemas.