Параметры Grep с несколькими параметрами bash

Я пишу bash script, который будет искать в нескольких файлах.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу egrep неопределенное количество переменных, переданных в качестве параметров в bash script

Я хочу, чтобы он сделал следующее:

Задано случайное число параметров. то есть:

./searchline.sh A B C

Сделайте grep на первом, и egrep результат с остальными:

grep "A" * | egrep B | egrep C

То, что я пытался сделать, это построить строку с egreps:

for j in "${@:2}";
do
ADDITIONALSEARCH="$ADDITIONALSEARCH | egrep $j";
done

grep "$1" * "$ADDITIONALSEARCH"

Но каким-то образом это не сработает, кажется, что bash не обрабатывает строку egrep как egrep.

У вас есть какие-либо советы?

Кстати, как побочная заметка, я не могу создать какой-либо вспомогательный файл, поэтому grep -f выходит из строки, я думаю. Также обратите внимание, что число параметров, переданных в bash script, является переменной, поэтому я не могу выполнить egrep "$ 2" | egrep "$ 3".

Спасибо заранее.

Фернандо

Ответ 1

Безопасное eval может быть хорошим решением

#!/bin/bash

if [[ $# -gt 0 ]]; then
    TEMP=("grep" "-e" "\"\$1\"" "*")
    for (( I = 2; I <= $#; ++I )); do
        TEMP=("${TEMP[@]}" "|" "egrep" "-e" "\"\$${I}\"")
    done
    eval "${TEMP[@]}"
fi

Чтобы запустить его:

bash script.sh A B C

Ответ 2

Здесь вы можете использовать рекурсию для получения требуемого количества каналов:

#!/bin/bash

rec_egrep() {
    if [ $# -eq 0 ]; then
        exec cat
    elif [ $# -eq 1 ]; then
        exec egrep "$1"
    else
        local pat=$1
        shift
        egrep "$pat" | rec_egrep "[email protected]"
    fi
}

first_arg="$1"
shift
grep "$first_arg" * | rec_egrep "[email protected]"