commande grep dans Bash

J’ai écrit la fonction suivante dans Bash:

function findTest { files=`ls $1` for file in ${files[*]}; do if [[ "$file"=="*.tst" ]]; then grep "version: $2" $1/$file if [[ $? -eq 0 ]]; then echo -n $2 grep "result" | cut -d ":" -f2 fi fi done } 

pour une raison étrange, la ligne grep "version: $2" $1/$file prétend que $1/$file n’est pas un fichier / répertoire, pourtant je sais que $ 1 contient une adresse de répertoire dans laquelle $ file existe. Y a-t-il une raison rationnelle pour laquelle

Plutôt que d’essayer de lancer ls et d’parsingr, il est préférable d’utiliser les fichiers de globalisation et de liste d’une extension dans for boucle:

 findTest() { for file in "$1"/*.tst; do if grep -q "version: $2" "$file"; then echo "grep succeded" fi done } 

L’extrait de code contient un certain nombre de problèmes.

http://www.shellcheck.net en trouve beaucoup.

  1 function findTest { 2 files=`ls $1` ^––SC2006 Use $(..) instead of legacy `..`. ^––SC2086 Double quote to prevent globbing and word splitting. 3 for file in ${files[*]}; do 4 if [[ "$file"=="*.tst" ]]; then ^––SC2077 You need spaces around the comparison operator. ^––SC2140 The double quotes around this do nothing. Remove or escape them. 5 grep "version: $2" $1/$file ^––SC2086 Double quote to prevent globbing and word splitting. ^––SC2086 Double quote to prevent globbing and word splitting. 6 if [[ $? -eq 0 ]]; then 7 echo -n $2 ^––SC2086 Double quote to prevent globbing and word splitting. 8 grep "result" | cut -d ":" -f2 9 fi 10 fi 11 done 12 } 

Les choses qu’il ne trouve pas sont des choses comme Pourquoi vous ne devriez pas parsingr le résultat de ls (1) et que ces files ne sont pas un tableau comme vous avez essayé de créer ou que ${files[*]} ( en supposant que c’était un tableau) serait moins utile que "${files[@]}" puisque la version * (citée ou non) ne gère pas les fichiers avec des espaces dans les noms, etc.