web-dev-qa-db-fra.com

Une ligne si/autre condition dans les scripts de shell Linux

Je voudrais avoir l'équivalent de ce qui suit dans une condition one line if/else.

$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  

J'essaie de mettre cela dans une commande d'une ligne. Jusqu'ici, j'ai tout compris, sauf la partie else de la commande. Voici ce que j'ai jusqu'à présent ...

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

Alors, comment puis-je inclure la partie else du code ci-dessus dans ma commande? Merci d'avance pour votre aide.

16
Joshua Strot

On dirait que vous êtes sur la bonne voie. Vous devez juste ajouter l'instruction else après le ";" après la déclaration "then". De plus, je séparerais la première ligne de la deuxième ligne avec un point-virgule au lieu de la joindre avec "&&".

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

De même, dans votre script d'origine, lors de la déclaration de maxline, vous avez utilisé des guillemets "" "au lieu de guillemets simples" "", ce qui peut poser problème.

23
Bryan

Ce n'est pas une réponse directe à la question mais vous pouvez simplement utiliser l'opérateur 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."
4
erlc

Pour résumer les autres réponses, à usage général:

Multiligne si ... alors statement

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

Version monoligne

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

Utilisation de l'opérateur OR

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

Remarques

N'oubliez pas que les opérateurs AND et OR déterminent si le code de résultat de l'opération précédente était égal à true/success (0). Ainsi, si une fonction personnalisée renvoie quelque chose d'autre (ou rien du tout), vous pourriez avoir des problèmes avec le raccourci AND/OR. Dans ce cas, vous voudrez peut-être remplacer quelque chose comme ( a && b ) par ( [ a == 'EXPECTEDRESULT' ] && b ), etc.

Notez également que ( et [ sont des commandes techniques. Par conséquent, des espaces sont nécessaires.

Au lieu d'un groupe d'instructions && comme then a && b; else, vous pouvez également exécuter des instructions dans un sous-shell tel que then $( a; b ); else, bien que cela soit moins efficace. La même chose est vraie pour faire quelque chose comme result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] au lieu de ( foo && a && b ) || ( bar && c && d ). Bien que, à ce stade, vous vous fassiez de plus en plus dans des trucs multi-lignes moins compacts.

1
Beejor