Quelle commande signifie «ne rien faire» dans un conditionnel dans Bash?

180

Parfois, lors de la création de conditions, j'ai besoin que le code ne fasse rien, par exemple, ici, je veux que Bash ne fasse rien quand $aest supérieur à "10", imprime "1" si $aest inférieur à "5", sinon, imprime "2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Cela fait cependant une erreur. Existe-t-il une commande qui ne fera rien et ne ralentira pas non plus mon script?

Village
la source

Réponses:

340

La commande no-op dans le shell est :(deux-points).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

À partir du manuel bash :

:(un deux-points)
Ne faites rien d'autre que développer des arguments et effectuer des redirections. Le statut de retour est zéro.

Barmar
la source
3
@SaintHax Non, il ne fonctionne pas true. Il est intégré à la coque et ne fait rien.
Barmar
1
c'est un shell intégré (vous avez raison), il renvoie true (statut 0) tout comme le fait true, et il est plus difficile à lire. Bash est un langage DevOps, et s'il :est écrit par quelqu'un de mon équipe, je le ferais changer.
SaintHax
3
@SaintHax Si quelqu'un utilisait truedans un contexte non conditionnel, je lui demanderais de le changer. if trueest bien, then truesemble faux.
Barmar
1
Bien sûr, vous pouvez simplement réécrire le code à utiliser à la if ! condition; then do something; fiplace de if condition; then :; else do something; fi.
Barmar
Je suis d'accord avec toi. Cet exemple pourrait être écrit si / elif / else en utilisant des conditions composées et serait mieux.
SaintHax
38

Vous pouvez probablement simplement utiliser la truecommande:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Une alternative, dans votre cas d'exemple (mais pas nécessairement partout) est de réorganiser votre if / else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
Flimzy
la source
8
Si vous ne testez pas le résultat à la fois trueet que vous falseêtes effectivement non-op en ce qui concerne le script, mais en principe, ils pourraient créer des shells acceptant cette syntaxe, alors c'est peut :- être mieux.
dmckee --- ex-moderator chaton
3
La question est étiquetée bash. Dans bash, trueet falsesont intégrés. Pour les réservoirs plus âgés, true, falseet même :peut - être des commandes externes (bien que vous verriez probablement celle - ci que dans très coquilles vieux).
Keith Thompson
6
Je préfère :simplement parce que l'intention est plus explicite
Freedom_Ben
9

Bien que je ne réponde pas à la question initiale concernant la commande no-op, de nombreux problèmes (sinon la plupart) lorsque l'on peut penser " dans cette branche je n'ai rien à faire " peuvent être contournés en restructurant simplement la logique pour que cette branche gagne ça ne se produit pas.

J'essaye de donner une règle générale en utilisant l'exemple des OP

ne rien faire quand $ a est supérieur à "10", imprimer "1" si $ a est inférieur à "5", sinon, imprimer "2"

nous devons éviter une branche où $aobtient plus de 10, afin $a < 10qu'une condition générale puisse être appliquée à toutes les autres, condition suivante.

De manière générale, quand vous dites ne rien faire quand X , puis reformulez comme éviter une branche où X . Habituellement, vous pouvez faire l'évitement en annulant simplement X et en l'appliquant à toutes les autres conditions.

Ainsi, l'exemple des OP avec la règle appliquée peut être restructuré comme suit:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Juste une variation de ce qui précède, en incluant tout dans la $a < 10condition:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(Pour cet exemple spécifique, la restructuration @Flimzys est certainement meilleure, mais je voulais donner une règle générale à toutes les personnes qui cherchent à ne rien faire.)

KeyNone
la source
5
Une des raisons pour lesquelles quelqu'un pourrait vouloir avoir un no-op est lors de la structuration initiale du code avec l'idée que l'on ajoutera le "ajouter quelque chose ici plus tard" sans avoir d'effets secondaires par inadvertance. Par exemple, si l'on met un if-then-else-fi dans un .bashrc, si vous le mettez, echo "put stuff here"cela cassera certaines des utilisations non liées à la connexion (par exemple, scp est cassé), et seuls les espaces / commentaires provoquent une erreur d'exécution.
Aphoid