Quelle commande signifie "Ne rien faire" dans un conditionnel dans Bash?

Parfois, lorsque je fais des conditions, j'ai besoin du code pour ne rien faire, par exemple, ici, je veux que Bash ne fasse rien Quand $a est supérieur à "10", imprimer "1" Si $a est inférieur à "5", sinon, imprimer "2":

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

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

116
demandé sur codeforester 2013-07-11 05:24:37

3 réponses

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

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

Du manuel bash :

: (un côlon)
Ne faites rien au-delà de l'expansion des arguments et des redirections. Le statut de retour est zéro.

233
répondu Barmar 2017-05-26 19:31:34

Vous pouvez probablement simplement utiliser la commande true:

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

Une alternative, dans votre 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
28
répondu Flimzy 2013-07-11 01:26:19

Bien que je ne réponde pas à la question initiale concernant la commande no-op, de nombreux problèmes (sinon la plupart) quand on peut penser "dans cette branche, Je ne dois rien faire" peuvent être contournés en restructurant simplement la logique pour que cette branche ne se produise pas.

J'essaie de donner une règle générale en utilisant L'exemple OPs

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

Nous devons éviter un branche où $a obtient plus de 10, donc $a < 10 en tant que condition générale peut être appliquée à toutes les autres conditions suivantes.

En général, quand vous dites ne rien faire lorsque X, puis reformuler comme éviter une branche où X. Habituellement, vous pouvez faire en sorte que L'évitement se produise en annulant simplement X et en l'appliquant à toutes les autres conditions.

Ainsi, l'exemple OPs 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, enfermant tout dans la condition $a < 10:

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

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

8
répondu Basti M 2017-05-23 12:10:26