2017-02-01 5 views
0

J'ai une variable dont la valeur que je veux passer dans une commande. Cependant, le $ produit des résultats inhabituels. Il semble agir comme un * et rechercher tous les répertoires. Mon code est:valeur de passage bash en commande

"Please enter the test type: " 
read test 

result="pass" 
search_result=`find ./logs/$test_2017_01_logs*/* -type f -name func_log -exec egrep $result {} \;` 

echo "$search_result" 

Je veux seulement rechercher le suffixe de répertoire qui a été lu par l'utilisateur, et non pas tous les répertoires qui est ce que fait mon code.

est la question en raison de la concaténation du passé en valeur ($ test) et le reste du nom du dossier (_2017_01_logs *)?

Répondre

2

_ est un "caractère de mot" ([a-zA-Z0-9_]) et est compris comme faisant partie de la variable que vous adressez, qui est donc le $test_2017_01_logs indéfini.

Pour éviter cela, vous pouvez joindre le nom de la variable entre accolades:

find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \; 

Ou, si nous suivons les conseils bien avisés de Charles Duffy:

find ./logs/"$test"_2017_01_logs*/* -type f -name func_log -exec egrep -h -e "$result" /dev/null {} + 
+1

pouvez également ajouter des guillemets autour '$ result', de sorte qu'il ne soit pas divisé par mot (avec les mots au-delà du premier interprétés comme des noms de fichiers supplémentaires). –

+2

Je suggère également '-exec egrep -h -e "$ result"/ dev/null {} +' - Nous ne courons pas 'grep' fois plus que nous avons besoin, et (en raison de la précédant '-e') interprète' result' comme une chaîne littérale même si elle commence par un tiret. (Le '-h' supprime les noms de fichier en sortie, pour obtenir un comportement équivalent à l'utilisation courante même lorsque plusieurs noms sont passés, si vous les voulez, retirez-le). –

+2

... le '/ dev/null' est là parce que' grep' change son comportement dans certains cas en fonction du nombre de noms de fichiers transmis; le fait d'être présent assure que vous obtenez un comportement cohérent, quel que soit le nombre de résultats que 'find' ajoute à la ligne de commande, et signifie que si l'idiome est réutilisé avec' xargs', nous n'obtenons pas une instance de stdin avec une implémentation cela fait suite à l'invocation dans le cas 0-results-found (IIRC, l'implémentation de MacOS en fait partie). –