bash读输入(1个强制和1个可选)并grep这两个变量然后重定向结果

时间:2014-11-13 11:54:12

标签: bash shell input grep arguments

读取输入(1个强制和1个可选)

并从abc.txt grep这两个变量 然后将结果重定向到新的txt

read c d

while [ $# -ne 1 ]; do    #why -ne not -ge as grep c when there is at least 1 argument
        echo "Search result :"
        grep "$c" abc.txt
else grep "$c" "$d" abc.txt
break
done

尝试过很多次,会将cd作为一个参数,或者只是忽略我的d参数。在这种情况下我需要使用shift吗?

2 个答案:

答案 0 :(得分:1)

$#是shell脚本的命令行参数数。 read并未更改此值。

你想要的是:

if [[ -z "$d" ]]; then
    # one argument
else 
    # two or more arguments
fi

或者,您可以使用命令行中的参数调用您的参数(即./script c d)。 为此,请将read c d替换为:

c="$1"
shift
d="$*"

答案 1 :(得分:0)

您可以使用${d+value_if_set}填写$d出现时要使用的值。

grep -e "$c" ${d+-e "$d"} abc.txt >new.txt

在第一个设置-e后添加第二个$d参数。因此,您最终会在此方案中运行grep -e "$c" -e "$d" abc.txt

我已经阅读了(很久以前)一些建议,反对使用-e多个grep参数,但它至少适用于GNU grep和OSX(* BSD)grep

或者,您可以使用grep -E并修改正则表达式:

grep -E "$c${d+|$d}" abc.txt >new.txt

此处,正则表达式为$c$c|$d。但是您应该注意,-E语法还会更改您在$c$d中放置内容的语义。