代码之家  ›  专栏  ›  技术社区  ›  OverLex

Bash脚本:参数替换问题

  •  0
  • OverLex  · 技术社区  · 14 年前

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

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

    并导致ls:无法访问*ext.2010-09-{10,11}.Z:没有这样的文件或目录

    但如果我执行这个:

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

    它完美地工作。。。

    编辑-故意添加解释

    我要做的是填充变量 对于所有与给定模式匹配的文件名(*ext.2010-09-{10,11}),我知道我可以使用for循环来解决这个问题,但是我考虑使用大括号来表示简短。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Rudu Andrew Whitaker    14 年前

    问题是当您直接在命令行上执行它时 \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脚本,因为 输出。

    以下是解决方案脚本:

    #!/bin/sh
    DAYS="10 11"
    for i in $DAYS;
    do
      ls *ext.2010-09-$i.Z
    done
    
        2
  •  3
  •   Daenyth    14 年前

    这是因为大括号展开发生在变量展开之前。首先,它扩展了大括号——除了在你的论点中没有一个括号 ls . 然后它展开变量。然后它运行它。在这一点上,现在已经太迟了。

    如果你详细说明你要解决的具体问题,我也许能帮你找到更好的办法。

        3
  •  1
  •   Giuseppe Guerrini    14 年前

    如果将{x,y}组赋给变量,{x,y}组将不再展开。但您可以编写一个类似“ls…”的字符串并将其提交给“eval”函数。 再见!

        4
  •  0
  •   Dennis Williamson    14 年前

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

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