使用Bash变量进行扩展 - {0 .. $ foo}

时间:2012-02-18 00:56:40

标签: bash brace-expansion

WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}

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

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

5 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:10)

bashbrace expansion之前variable expansion weekly.{0..4},因此您获得eval
由于结果是可预测且安全的(不信任用户输入),因此您可以在案例中使用$ WEEKS_TO_SAVE=4 $ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"

eval

注意

  1. eval是邪恶的
  2. 谨慎使用$((..))
  3. 此处,{{1}}用于强制将变量计算为整数表达式。

答案 2 :(得分:9)

另一种没有eval并且仅调用mkdir一次的方法:

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

答案 3 :(得分:2)

Brace expansion不支持它。您必须使用loop

执行此操作
  

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

答案 4 :(得分:1)

如果您的盒子上安装了zsh,那么如果您使用#!/bin/zsh作为翻译,那么您编写的代码将与Z-shell一起使用:

实施例

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