2013-05-09 4 views
5

La sortie est vide dans le script ci-dessous. Qu'est-ce qui manque? Je suis en train de grep une chaînescript shell grep pour grep une chaîne

#!/bin/ksh  
file=$abc_def_APP_13.4.5.2  
if grep -q abc_def_APP $file; then 
echo "File Found" 
else 
echo "File not Found" 
fi 
+2

Pourquoi le #! ligne dire ksh? – jman

+1

Quelle est la valeur de 'file' supposée être? Je soupçonne que vous pourriez avoir un problème sur l'ERS de cette mission. – chepner

Répondre

9

En bash, utilisez la redirection <<< d'une chaîne (un 'Here string'):

if grep -q abc_def_APP <<< $file 

Dans d'autres coquilles, vous devrez peut-être utiliser:

if echo $file | grep -q abc_def_APP 

J'ai mis mon then sur la ligne suivante; Si vous voulez votre then sur la même ligne, alors ajoutez ; then après ce que j'ai écrit.


Notez que cette mission:

file=$abc_def_APP_13.4.5.2 

est assez étrange; il prend la valeur d'une variable d'environnement ${abc_def_APP_13} et ajoute .4.5.2 à la fin (il doit être un var var car on peut voir le début du script). Vous avez probablement voulu écrire:

file=abc_def_APP_13.4.5.2 

En général, vous devez joindre les références aux variables contenant les noms de fichiers entre guillemets pour éviter des problèmes avec des espaces etc dans les noms de fichiers. Ce n'est pas critique ici, mais les bonnes pratiques sont de bonnes pratiques:

if grep -q abc_def_APP <<< "$file" 
if echo "$file" | grep -q abc_def_APP 
+0

Si j'utilise 'si echo $ file | grep -q abc_def_APP' il imprime le contenu de $ file, ce que je ne veux pas – Jill448

+0

Vous avez choisi l'option '-q' pour faire fonctionner' grep' en mode 'silencieux' (pour [POSIX] (http: // pubs .opengroup.org/onlinepubs/9699919799/utilities/grep.html)); il ne devrait rien sortir. Si votre version de 'grep' a une compréhension différente de' -q', vous devrez regarder la page de manuel de votre homme 'grep', ou rediriger vers'/dev/null'. –

+0

Le 1er a travaillé. 'si grep -q abc_def_APP <<< $ file' – Jill448

3

Yuck! Utilisez la chaîne correspondant à la coquille

if [[ "$file" == *abc_def_APP* ]]; then ... 
+0

ne risquez-vous pas de faire correspondre plusieurs fichiers avec' * abc_def_APP * 'et ruiner la condition dans le processus? Que se passe-t-il si '$ file' est' abc_def_APP1' et '* abc_def_APP *' étendu à 'abc_def_APP1 abc_def_APP2', la condition serait évaluée comme fausse. – Anthony

+0

et à propos du "Yuck!" partie ; Je suis totalement d'accord avec vous! l'ensemble du shell de commande unix (unix-like) est dégoûtant ... mais vous ne pouvez pas vivre sans lui, n'est-ce pas? – Anthony

+0

À l'intérieur des doubles crochets, nous avons un motif correspondant à la chaîne de gauche, ne correspondant pas aux noms de fichiers. –