Bash conditionnelle sur la commande code de sortie
En bash, je veux dire "si un fichier ne contient pas de XYZ, puis" faire un tas de choses. La façon la plus naturelle à la transposition de ce code est quelque chose comme:
if [ ! grep --quiet XYZ "$MyFile" ] ; then
... do things ...
fi
Mais bien sûr, ce n'est pas valable Bash syntaxe. Je pourrais utiliser backticks, mais là, je vais tester la sortie du fichier. Les deux solutions que je peux penser sont:
grep --quiet XYZ "$MyFile"
if [ $? -ne 0 ]; then
... do things ...
fi
Et
grep --quiet XYZ "$MyFile" ||
( ... do things ...
)
Je préfère la deuxième, c'est plus Lispy et le || pour le contrôle de flux n'est pas si rare dans les langages de script. Je peux voir les arguments pour la première, trop, bien que lorsque la personne qui lit la première ligne, ils ne savent pas pourquoi vous êtes l'exécution de la commande grep, on dirait que vous êtes d'exécution pour principal effet, plutôt que de contrôler une branche dans le script.
Est-il un troisième, manière plus directe qui utilise un if
déclaration et a la grep
dans la condition?
OriginalL'auteur Martin C. Martin | 2013-08-19
Vous devez vous connecter pour publier un commentaire.
Oui, il y a:
ou si la commande grep échoue
[
est une sorte d'alias pourtest
(ce qui requiert également]
). Doncif [ ... ]
est équivalent àif test ...
Que faire si vous voulez tester plusieurs conditions, dont l'une est sortie le statut d'une commande? Comme dans:
if [[ $OS == "windows" && command-exit-status==0 ]]; ...
? Je peux exécuter la commande et sauvez$?
bien sûr, mais j'aimerais le raccourci&&
comportement afin de ne pas exécuter la commande, sauf$OS==windows
. Toutes les bonnes idées?Vous pouvez l'écrire comme
if [[ $OS == "windows" ]] && command; then
ou si, même sans leif
comme[[ $OS == "windows" ]] && command && echo "All ok"
OriginalL'auteur
Vous n'avez pas besoin de la
[
]
(test
) pour vérifier la valeur de retour d'une commande. Juste essayer:OriginalL'auteur
C'est une question de goût car il y a évidemment de multiples solutions de travail. Quand j'ai affaire à un problème comme celui-ci, j'ai l'habitude d'appliquer
wc -l
après grep afin de compter les lignes qui correspondent. Ensuite, vous avez un seul nombre entier que vous pouvez évaluer dans une condition de test. Si la seule question est de savoir si il y a un match à tous (le nombre de correspondance des lignes n'a pas d'importance), puis d'appliquerwc
est probablement OTT et de l'évaluation degrep
le retour de code semble être la meilleure solution:OriginalL'auteur