【问题标题】:Interpreting shell variables in bracket grep解释括号 grep 中的 shell 变量
【发布时间】:2016-06-10 13:00:26
【问题描述】:

我有这样的命令:

grep ABC /tmp/dir{1,3,7}/file*.txt

它工作得很好,但我需要使用这样的文件名提取常量:

FILENAME="/tmp/dir{1,3,7}/file*.txt"
grep ABC $FILENAME

由于大括号,这不起作用。 我该怎么做?

【问题讨论】:

    标签: shell grep brace-expansion


    【解决方案1】:

    不要为此使用 eval,它没有必要也不安全。在 bash 中:

    $ cat file1
    abc
    $ cat file2
    dbf
    $ shopt -s nullglob
    $ x=( file{1,2} )
    $ grep 'b' "${x[@]}"
    file1:abc
    file2:dbf
    

    如果没有与通配模式匹配的文件名,nullglob option 会导致数组为空。

    【讨论】:

      【解决方案2】:

      这是eval 可能有用且希望安全的一种情况:

      eval grep ABC "$FILENAME"
      

      测试

      $ seq 10 > a1
      $ seq 10 > a2
      $ seq 10 > a3
      $ grep 5 a{1..3}
      a1:5
      a2:5
      a3:5
      

      但是如果我们将其存储在一个变量中,它就会变成文字......

      $ f=a{1..3}
      $ echo $f
      a{1..3}
      $ echo "$f"
      a{1..3}
      $ grep 5 "$f"
      grep: a{1..3}: No such file or directory
      

      因此使用eval:

      $ eval echo "$f"
      a1 a2 a3
      $ eval grep 5 "$f"
      a1:5
      a2:5
      a3:5
      

      【讨论】:

        【解决方案3】:

        您可以使用eval 执行以字符串形式给出的命令。

        dir{1,2,3} 在此命令后转换为字符串:FILENAME="/tmp/dir{1,3,7}/file*.txt"

        运行eval grep ABC $FILENAME 以获得所需的输出

        【讨论】:

        • 这是我几分钟前回答的:)
        • @fedorqui : 是的,我注意到页面刷新后.. :)
        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多