2015-04-16 2 views
1

Я написал следующую функцию в Bash:Grep команды в 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 
} 

по какой-то причине, линия grep "version: $2" $1/$file утверждает, что $1/$file не файл/каталог, но я знаю, за то, что $ 1 содержит адрес каталога, в котором $ файла exsists в есть ли рациональная причина

+0

попробовать 'Grep "версия: $ 2" "$ 1/$ файл"' –

+0

файлов '= \' Ls $ 1 \ '' не создает массив. Вы хотите 'files = ($ 1)' или 'files = (" $ 1 "/ *)', если '$ 1' - это каталог для этого. –

+2

Я бы включил set -x, чтобы вы могли видеть расширенную версию команды, которую она запускала, возможно, она не расширяется, как вы думаете. Кроме того, если у какого-либо из ваших имен файлов есть пробелы, у вас возникнут проблемы с этим маршрутом –

ответ

2

Вместо того, чтобы пытаться запустить ls и разобрать его вывод лучше использовать подстановку и список файлов с расширением в for цикле:.

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

Существует ряд проблем с опубликованным фрагментом.

http://www.shellcheck.net находит многие из них.

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 } 

Вещи, не найти такие вещи, как Why you shouldn't parse the output of ls(1) и files не является массивом, как вы, кажется, пытаются создать или что ${files[*]} (при условии, что это массив) будет менее полезным, чем "${files[@]}", так как версия * (цит или нет) не обрабатывает файлы с пробелами в именах и т.д.

+1

Еще одна проблема: команда 'grep" result "' не имеет указанного входного файла, поэтому она будет ждать ожидания ввода терминала. Я уверен, что это не намеренное поведение, но я не уверен, что он должен делать ... –

+0

@GordonDavisson: Я думаю, что OP пытается удалить имя файла из выхода 'grep' и, очевидно, не знают о расширении строки bash. – cdarke

Смежные вопросы