2010-06-29 18 views
1

J'essaie d'exécuter une commande shell si une chaîne n'est pas présente dans un fichier texte. Si je colle cette ligne dans la ligne de commande si me donne une erreur.Commande Shell - condition basée sur la sortie de la commande?

if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi; 

Erreur:

-bash: [: -eq: unary operator expected 

Répondre

5

Si vous utilisez [] pour la comparaison vous devez utiliser = au lieu de -eq. Vous avez également besoin de citations.

if [ "$(cat textfile.txt | grep 'search string')" = "" ]; then; echo "some string"; fi; 

Notez que grep peut prendre un nom de fichier comme argument de sorte que le cat est inutile. Vous pouvez également utiliser directement la valeur de retour de grep: grep renvoie 1 si la chaîne de recherche est introuvable.

if [ "$(grep 'search string' textfile.txt)" ]; then 
    echo "some string"; 
fi 

Une façon encore plus compacte serait d'utiliser logique et &&.

grep "search string" textfile.txt && echo "some string" 
+0

Vous n'avez pas besoin de changer les guillemets, ceci est parfaitement valide bash: '" $ (cat textfile.txt | grep "chaîne de recherche") "' – Tyilo

1

La commande grep retourne 0 si les lignes demandées se trouvent (1 sinon, 2 en cas d'erreur), de sorte que vous pouvez simplement utiliser:

grep "search string" textfile.txt >/dev/null 2>&1 
if [[ $? -ne 0 ]] ; then 
    echo 'Not found' 
fi 

Si vous vraiment voulait utiliser des chaînes (et vous ne devriez probablement pas), vous devez les citer afin de ne pas avoir trop d'arguments pour lecommande:

if [ "$(cat textfile.txt | grep 'search string')" == "" ] ; then 
    echo "It's not there!" 
fi 
+0

Je ne l'ai pas downvote, mais votre réponse est loin d'être optimale: Il n'y a pas besoin de faire parce que 'grep' redirections a une option' -q' et Bash le peuvent test pour la valeur de retour d'une commande sans recourir à '$?'. – Philipp

+0

Ça va, Philipp. Tous les greps n'ont pas ces options (je travaille toujours avec quelques UNIX hérités) et je ne ferais pas de script shell pour l'efficacité de toute façon.Je vais incorporer votre réponse dans mes scripts (modernes) à l'avenir donc +1 pour cela. – paxdiablo

2
grep -F -q -e 'search string' textfile.txt || echo 'Not found' 

Note:

  • -F empêche l'interprétation de la chaîne de recherche comme une expression régulière.
  • -q supprime toutes les sorties et renvoie immédiatement après la première instance a été trouvé, ce qui rend la recherche beaucoup plus rapide si la chaîne se produit au début d'un fichier volumineux.
  • -e Spécifie explicitement le motif, autorisant les motifs commençant par un tiret.
  • Utilisez des guillemets simples sauf si vous voulez des substitutions de variables.
+0

élégance. quelque part le long de la ligne, quelqu'un a essayé de transformer bash en perl '[[$ (' malheureusement. – msw

1

Pas besoin de crochets dans ce cas. Puisque [ est réellement une commande, n'importe quelle commande peut être employée où vous l'emploieriez. Donc, ici, nous pouvons utiliser grep. Il n'est pas nécessaire d'utiliser cat puisque grep accepte les noms de fichiers comme arguments. En outre, vous avez deux trop de points-virgules.

if grep -q "search string" textfile.txt; then echo "some string"; fi 

ou

if grep "search string" textfile.txt > /dev/null 2>&1; then echo "some string"; fi