【问题标题】:save wild-card in variable in shell script and evaluate/expand them at runtime将通配符保存在 shell 脚本中的变量中并在运行时评估/扩展它们
【发布时间】:2011-03-28 20:35:04
【问题描述】:

我在运行下面的脚本时遇到了问题(请注意,在 Cygwin on win 7 中)。 让我们称之为“myscript.sh” 当我运行它时,以下是我输入的内容:

年月:2011-03
日模式:2{5,6,7}
日志文件名:错误*
查询:警告

#! /bin/bash
yearmonth=''
daypattern=''
logfilename=''
sPath=''
q=''

echo -n "yearmonth: "
read yearmonth

echo -n "daypattern: "
read daypattern

echo -n "logfilename: "
read logfilename

echo -n "query: "
read q

cat "$yearmonth/$daypattern/$logfilename" | grep --color $q

我得到的输出是:

cat: /2011-03/2{5,6,7}/error* 没有 文件目录存在。

但是,如果我输入 daypattern=25 或 daypattern=26 等,脚本将起作用。 此外,当然,如果我在 shell 本身中键入命令,通配符会按预期扩展。 但这不是我想要的。 我希望能够提示用户根据需要输入表达式,然后在脚本中执行这些命令。

有什么想法可以做到吗?

非常感谢您的帮助。

【问题讨论】:

  • 不要引用字符串(但这是对 cat 的无用使用,因为下面来自 jabbie 的最佳答案)

标签: linux shell wildcard expansion


【解决方案1】:

试试eval,这应该适用于 {a,d} 和 * 情况

  eval grep --color $q  ${yearmonth}/${daypattern}/${logfilename}

【讨论】:

  • 哇,这反应真快!谢谢!它的工作原理~!这个论坛很棒。它有效,但我真的不明白它是如何工作的。您介意快速解释一下 EVAL 的工作原理以及在这种情况下 ${} 吗?
  • This Unix & Linux Stack Exchange question 有更多关于eval 的详细信息。
【解决方案2】:

使用引号防止通配符扩展:

$ a="*.py"
$ echo $a
google.py pair.py recipe-523047-1.py
$ echo "$a"
*.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2018-03-20
    • 1970-01-01
    • 2021-07-04
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多