La commande Bash Shell `if` renvoie quelque chose` then` fait quelque chose

J’essaie de faire une instruction if / then, où si il y a une sortie non vide d’un ls | grep something ls | grep something commande alors je veux exécuter des instructions. Je ne connais pas la syntaxe que je devrais utiliser. J’ai essayé plusieurs variantes de ceci:

 if [[ `ls | grep log ` ]]; then echo "there are files of type log"; 

Eh bien, c’est proche, mais vous devez finir le if avec fi .

En outre, if exécute simplement une commande et exécute le code conditionnel si la commande réussit (quitte avec le code d’état 0), ce que ne fait grep que s’il trouve au moins une correspondance. Vous n’avez donc pas besoin de vérifier le résultat:

 if ls | grep -q log; then echo "there are files of type log"; fi 

Si vous êtes sur un système avec une version plus ancienne ou non-GNU de grep qui ne supporte pas l’option -q (“quiet”), vous pouvez obtenir le même résultat en redirigeant sa sortie vers /dev/null :

 if ls | grep log >/dev/null; then echo "there are files of type log"; fi 

Mais comme ls renvoie également non nul s’il ne trouve pas un fichier spécifié, vous pouvez faire la même chose sans le grep , comme dans la réponse de D.Shawley:

 if ls *log* >&/dev/null; then echo "there are files of type log"; fi 

Vous pouvez aussi le faire en utilisant uniquement le shell, sans même avoir le ls , bien que ce soit un peu plus verbeux:

 for f in *log*; do # even if there are no matching files, the body of this loop will run once # with $f set to the literal ssortingng "*log*", so make sure there's really # a file there: if [ -e "$f" ]; then echo "there are files of type log" break fi done 

Tant que vous utilisez spécifiquement bash, vous pouvez définir l’option nullglob pour la simplifier quelque peu:

 shopt -s nullglob for f in *log*; do echo "There are files of type log" break done 

Ou sans if; then; fi if; then; fi if; then; fi :

 ls | grep -q log && echo 'there are files of type log' 

Ou même:

 ls *log* &>/dev/null && echo 'there are files of type log' 

Le if intégré exécute une commande shell et sélectionne le bloc en fonction de la valeur de retour de la commande. ls renvoie un code de statut distinct s’il ne trouve pas les fichiers demandés. La partie grep n’est donc pas nécessaire. L’ utilitaire [[ est en fait une commande intégrée de bash, IIRC, qui effectue des opérations arithmétiques. Je peux me tromper sur cette partie car je m’éloigne rarement de la syntaxe du shell Bourne.

Quoi qu’il en soit, si vous mettez tout cela ensemble, vous obtenez la commande suivante:

 if ls *log* > /dev/null 2>&1 then echo "there are files of type log" fi