【问题标题】:Bash scripting: parameter substitution problemBash 脚本:参数替换问题
【发布时间】:2010-09-17 15:37:06
【问题描述】:

我正在尝试编写一个简单的 bash 脚本,但似乎有问题,我正在命令行上测试以下内容:

DATE="2010-09-{10,11}"
result=`\ls *ext.$DATE.Z`

并导致 ls: cannot access *ext.2010-09-{10,11}.Z: No such file or directory

但是如果我执行这个:

result=`\ls *ext.2010-09-{10,11}.Z`

完美运行...

我什至尝试从 DATE 参数中删除引号,但这不是问题,bash 手册没有帮助,我做错了什么?不是应该执行参数替换并将其传递给我的命令吗?

我认为我应该避开 $ 符号,但这也没有用。

编辑 - 添加的目的说明

我想要完成的是用所有匹配给定模式 (*ext.2010-09-{10,11}) 的文件名填充变量 result,我知道我可以解决这个问题使用 for 循环,但我考虑过使用花括号来缩短。

【问题讨论】:

  • 你为什么要像\ls一样运行它?别名不会延续到脚本中。

标签: bash command-line parameters shell


【解决方案1】:

问题是当您直接在命令行上执行它时,\ls *ext.2010-09-{10,11}.Z 是一个扩展为两个命令的简短形式:ls *ext.2010-09-10.Z 和 ls *ext.2010-09-11.Z(通过命令行 - 随后调用每个命令)。 ls 本身并不直接支持这样的表达式,所以当你将它构建到脚本中时,它会得到它不理解的文字字符串。

并非所有命令行都支持大括号扩展,isn't recommended for shell scripts:

大括号扩展不应该用于 可移植的 shell 脚本,因为 Bourne shell 不会产生相同的结果 输出。

这是一个解决方案脚本:

#!/bin/sh
DAYS="10 11"
for i in $DAYS;
do
  ls *ext.2010-09-$i.Z
done

【讨论】:

  • 正确,您的帖子完成了我的简短解释。问候
  • 但是问题被标记为 [bash] 而不是 [sh] 或 [bourne],如果你有一个显示 #!/bin/bash 的 shebang,你应该能够使用 Bash 功能。
【解决方案2】:

这是因为大括号扩展发生在变量扩展之前。首先,它扩展了大括号——除了你对ls 的参数中没有括号。然后它扩展变量。然后它运行它。此时展开大括号为时已晚。

如果您详细说明您要解决的具体问题,我可能会帮助您找到更好的方法。

【讨论】:

    【解决方案3】:

    如果将 {x,y} 组分配给变量,则不会再扩展它。但是您可以编写一个类似“ls ...”的字符串并将其提交给“eval”函数。 再见!

    【讨论】:

    • eval 不安全,可能会引入安全漏洞。可能有更好的方法
    【解决方案4】:

    这会将您要查找的文件名放入变量中:

    result=$(echo *ext.2010-09-{10,11}.Z)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2014-02-16
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多