【问题标题】:bash read inputs (1 mandatory and 1 optional) and grep these two variables then redirect resultbash 读取输入(1 个强制和 1 个可选)并 grep 这两个变量然后重定向结果
【发布时间】:2015-01-10 13:35:27
【问题描述】:

读取输入(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 吗?

【问题讨论】:

  • 欢迎来到 SO!请花一些时间重写您的问题,使其有意义,并对格式进行一些处理。

标签: bash shell input grep arguments


【解决方案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="$*"

【讨论】:

    【解决方案2】:

    您可以使用${d+value_if_set} 填写一个值,以便在$d 存在时使用。

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

    如果设置了$d,这将在第一个参数之后添加第二个-e。所以你最终在这种情况下运行grep -e "$c" -e "$d" abc.txt

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

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

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

    这里,正则表达式是$c$c|$d。但您应该注意,-E 语法也会改变您在 $c$d 中输入的内容的语义。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2018-05-29
      • 2017-03-11
      • 1970-01-01
      • 2019-07-09
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多