GNU/Linux >> Tutoriels Linux >  >> Linux

Condition if/else sur une ligne dans les scripts shell linux

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

Multi-lignes si...alors déclaration

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

Utiliser l'opérateur OR

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

Remarques

N'oubliez pas que les opérateurs AND et OR évaluent si oui ou non le code résultat de l'opération précédente était égal à true/success (0 ). Ainsi, si une fonction personnalisée renvoie autre chose (ou rien du tout), vous pouvez rencontrer des problèmes avec le raccourci AND/OR. Dans de tels cas, vous pouvez remplacer quelque chose comme ( a && b ) avec ( [ a == 'EXPECTEDRESULT' ] && b ) , etc.

Notez également que ( et [ sont techniquement des commandes, donc un espace est nécessaire autour d'eux.

Au lieu d'un groupe de && des déclarations comme then a && b; else , vous pouvez également exécuter des instructions dans un sous-shell comme then $( a; b ); else , même si c'est 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 qu'à ce stade, vous vous lanceriez de toute façon davantage dans des éléments multilignes moins compacts.


Il semble que vous étiez sur la bonne voie. Vous avez juste besoin d'ajouter l'instruction else après le ";" après l'instruction « alors ». 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

Toujours dans votre script d'origine, lors de la déclaration de maxline, vous utilisiez des back-ticks "`" au lieu de guillemets simples "'", ce qui pouvait causer des problèmes.


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."

Linux
  1. Alias ​​de ligne de commande dans le shell Linux

  2. 6 opérateurs de chaînage de ligne de commande Bash Shell sous Linux

  3. Comment lister un nom de fichier par ligne de sortie sous Linux ?

  4. Exécuter un script canalisé à partir de stdin (Linux/Shell Scripting)

  5. Comment insérer une nouvelle ligne dans le script shell Linux ?

25 questions et réponses d'entrevue sur les scripts Shell Linux

Shell Scripting Partie I :Premiers pas avec les scripts bash

Livre électronique gratuit de Packt - Linux Shell Scripting Cookbook - Troisième édition

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Qu'est-ce que Shebang dans Linux Shell Scripting ?

Bash Scripting :comment générer et formater du texte sur le shell Linux