Использовать аргумент bash неограниченное количество раз? - PullRequest
1 голос
/ 13 апреля 2019

У меня есть функция Grep ниже:

#!/bin/bash
echo What directory contains the text files with your data?
read mydirectory
cd $mydirectory
echo What should we name your output?
read $myoutput 
for file in *.txt; do
    grep -q $3 "$file" && grep -q foo "$file" && echo ""$file"">>"$myoutput.txt"
done 

Мне бы очень хотелось иметь возможность использовать аргументы из командной строки для более быстрого запуска скрипта. Я хочу иметь возможность нажать стрелку вверх, изменить несколько параметров и снова запустить скрипт.

Переменная $ 1 всегда будет каталогом с файлами .txt, над которыми я хочу запустить Grep. Переменная $ 2 всегда будет тем, что я хочу назвать своим выходным файлом. После этого каждый параметр должен использоваться в позиции $ 3 функции grep. Моя проблема в том, что мне нужно выполнять "n" наборов условий в зависимости от того, что я ищу в своих файлах.

Например, иногда это может быть:

#!/bin/bash
echo What directory contains the text files with your data?
read mydirectory
cd $mydirectory
echo What should we name your output/
read $myoutput 
for file in *.txt; do
    grep -q 30 "$file" && grep -q 8 "$file" && grep -q 12 "$file" && grep -q B "$file" && echo ""$file"">>"$myoutput.txt"
done 

В других случаях это может быть:

 #!/bin/bash
echo What directory contains the text files with your data?
read mydirectory
cd $mydirectory
echo What should we name your output?
read $myoutput 
for file in *.txt; do
    grep -q 30 "$file" && grep -q 8 "$file" && grep -q 12 "$file" && grep -q 13 "$file" && grep -q 18 "$file" && grep -q B "$file" && echo ""$file"">>"$myoutput.txt"
done 

Есть ли хитрый способ обойти это? Я искал в Интернете, но ничего не смог найти. Спасибо за вашу помощь!

1 Ответ

1 голос
/ 13 апреля 2019

Установите флаг в true и зациклите все условия поиска.Если какой-либо поиск не удался, снимите флажок.

for file in *.txt; do
    match=1
    for term in "${@:3}"; do
        grep -q "$term" "$file" || { match=0; break; }
    done
    ((match)) && echo "$file">>"$myoutput.txt"
done 

Это хорошее место для вспомогательной функции.

all_found() {
    local file=$1
    shift

    local term
    for term in "$@"; do
        grep -q "$term" "$file" || return 1
    done
    return 0
}

for file in *.txt; do
    all_found "$file" "${@:3}" && echo "$file">>"$myoutput.txt"
done 
...