读取输入(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
尝试过很多次,会将c
,d
作为一个参数,或者只是忽略我的d
参数。在这种情况下我需要使用shift吗?
答案 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
中放置内容的语义。