Bash函数用grep,使用if和then语句

时间:2015-12-06 23:33:24

标签: linux bash shell variables if-statement

我一直在尝试构建一个允许我执行动态grep搜索的函数 - 动态,如果在调用函数时指定了多个变量,那么它将通过grep传递附加变量。我真的不需要超过2个变量,但也有兴趣学习如何做到这一点。

所需功能的示例:

> function word1 word2

结果:

(
   cd /path/folder;
   less staticfile | grep -i word1 | grep -i --color word2
)

如果总有两个单词,上面的作品很棒。我试图学习如何使用if和then语句来让我在变量数量上保持灵活性。

function () 
{
   if [ ! "$#" -gt "1" ];
        then
           (
              cd ~/path/folder;
              less staticfile | grep -i $1 | grep --color -i $2
           )
        else
           (
              cd ~/path/folder;
              less staticfile | grep --color $1
           )
   fi
}

当我运行此功能时,它似乎正好相反 -

> function word1

返回错误,因为它正在使用"然后"声明由于某种原因但没有任何内容可以插入到第二个grep调用中。

> function word1 word2

只有greps" word1" - 因此正在使用" else"声明。 我究竟做错了什么?有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:0)

我认为这会做你想要的。你可以实现它的功能。 (注意grep之后的间接使用。)这是代码后跟测试文件&输出。 (取任何args。)

#!/bin/bash
if [[ $# -lt 2 ]]; then
    echo -e "\nusage: ./prog.sh file grep-string1 grep-string2 grep-string3...\n"
    echo -e "At least two arguments are required. exiting.\n"
    exit 5
fi
fname=$1  # always make your file name the first argument
i=2  # initialize the argument counter
cmd="cat $fname"
while [[ $i -le $# ]]; do
    cmd=${cmd}" | grep ${!i}"
    (( i++ ))
done
eval $cmd

因此,此输入文件可能被称为tfile,内容为:

a circuit
pavement
bye

以这种方式运行代码:

./prog.sh tfile e ye
bye