【问题标题】:Brace expansion with a Bash variable - {0..$foo}使用 Bash 变量进行大括号扩展 - {0..$foo}
【发布时间】:2012-03-09 09:33:22
【问题描述】:
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}

给我一​​个名为每周的文件夹。{0..4}

在创建我缺少的文件夹时大括号扩展有什么秘密吗?

【问题讨论】:

    标签: bash brace-expansion


    【解决方案1】:

    大括号不支持 BASH 中的变量,您可以这样做:

     for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
     do
        mkdir -p weekly.${c}
     done
    

    【讨论】:

      【解决方案2】:

      Brace expansion 不支持。您必须使用 loop 来完成此操作。

      大括号扩展在任何其他扩展之前执行,并且任何 结果中保留了其他扩展所特有的字符。它 是严格的文本。 Bash 不应用任何句法解释 到扩展的上下文或大括号之间的文本。到 避免与参数扩展冲突,字符串'${'不是 被认为有资格进行大括号扩展

      【讨论】:

        【解决方案3】:

        bashvariable expansion 之前执行brace expansion,所以你得到weekly.{0..4}
        因为结果是可预测且安全的(不信任用户输入),您可以在您的情况下使用eval

        $ WEEKS_TO_SAVE=4
        $ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"
        

        注意

        1. eval 是邪恶的
        2. 谨慎使用eval

        这里,$((..)) 用于强制将变量作为整数表达式求值。

        【讨论】:

        • 由于使用了 eval,我几乎对此投了反对票。我会认为 C-sytle for 循环是“正确”的方式,但这是在只运行一次 mkdir 时完成它的唯一方法。
        • eval 有什么问题?你在 bash 中所做的一切都是“危险的”,eval 不会让事情变得更糟。
        • @kev 我用谷歌搜索了“eval 是邪恶的”,发现:有价值的场景只占 eval 实际使用的一小部分。在大多数情况下,eval 的使用就像大锤拍打苍蝇一样——它可以完成工作,但威力太大。它很慢,很笨重,而且当你犯错时往往会扩大损失。那么这是一个值得的案例还是这里列出的其他选项更好?
        • 那句话是在谈论 JScript(即 MS JavaScript)。这里没有上下文。
        • @Grault,即使在这里也肯定是准确的;见上文,还有 BashFAQ #48 (mywiki.wooledge.org/BashFAQ/048)。
        【解决方案4】:

        如果您的机器上碰巧安装了zsh,如果您使用#!/bin/zsh 作为解释器,您编写的代码与Z-shell 一起工作:

        示例

        $ WEEKS_TO_SAVE=4
        $ echo {0..$WEEKS_TO_SAVE}
        0 1 2 3 4
        

        【讨论】:

          【解决方案5】:

          另一种不使用 eval 并且只调用 mkdir 一次的方法:

          WEEKS_TO_SAVE=4
          mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
          

          【讨论】:

          • 嘘,嘶嘶声;如果格式字符串中的 IFS 中有空格或其他字符,则不起作用。
          猜你喜欢
          • 1970-01-01
          • 2013-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多