Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Grep多个bash参数_Linux_Bash_Grep - Fatal编程技术网

Linux Grep多个bash参数

Linux Grep多个bash参数,linux,bash,grep,Linux,Bash,Grep,我正在写一个bash脚本,它将在多个文件中搜索 我遇到的问题是,我无法导出作为参数传递给bash脚本的未知数量的变量 我希望它执行以下操作: 给定一个随机数的参数。i、 e: ./searchline.sh A B C 对第一个进行grep,并将结果与其余结果进行比较: grep "A" * | egrep B | egrep C 我试着用egreps构建一个字符串: for j in "${@:2}"; do ADDITIONALSEARCH="$ADDITIONALSEARCH | eg

我正在写一个bash脚本,它将在多个文件中搜索

我遇到的问题是,我无法导出作为参数传递给bash脚本的未知数量的变量

我希望它执行以下操作:

给定一个随机数的参数。i、 e:

./searchline.sh A B C
对第一个进行grep,并将结果与其余结果进行比较:

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脚本的参数数量是可变的,因此我不能执行egrep$2 | egrep$3

提前谢谢


费尔南多

安全评估可能是一个很好的解决方案

#!/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

安全评估可能是一个很好的解决方案

#!/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

您可以在此处使用递归来获取所需数量的管道:

#!/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 "$@"
    fi
}

first_arg="$1"
shift
grep "$first_arg" * | rec_egrep "$@"

您可以在此处使用递归来获取所需数量的管道:

#!/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 "$@"
    fi
}

first_arg="$1"
shift
grep "$first_arg" * | rec_egrep "$@"

@fedorqui:“|”表示或,而不是和。当你用管道输送白鹭时,你需要模式的交叉点,所以一个AND。@fedorqui:“|”表示OR,而不是AND。当你用管道输送egrep时,你需要模式的交叉点,所以一个AND。@chepner是的,但我有时会选择使脚本更兼容。该方法适用于Bash3.1+,我不知道OP是否有新版本。哇,至少在我看来,使用eval实际上是安全的+1给你,先生。@chepner是的,但我有时会选择使脚本更兼容。该方法适用于Bash3.1+,我不知道OP是否有新版本。哇,至少在我看来,使用eval实际上是安全的+先生,给你一个。