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

xre*_*ref 13 bash brace-expansion

WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
Run Code Online (Sandbox Code Playgroud)

给我一个名为daily的文件夹.{0..4}

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

anu*_*ava 10

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

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


kev*_*kev 10

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

$ WEEKS_TO_SAVE=4
$ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"
Run Code Online (Sandbox Code Playgroud)

注意:

  1. eval 是邪恶的
  2. eval小心使用

这里,$((..))用于强制将变量计算为整数表达式.

  • 由于使用了eval,我几乎将其归结为此.我会认为C-sytle for循环是"正确"的方式,但这是在运行mkdir一次时完成它的唯一方法. (5认同)
  • 评估有什么问题?你在bash中所做的一切都是"危险的",eval不会让事情变得更糟. (4认同)
  • 那句话是关于JScript(即MS JavaScript).它在这里脱离了背景. (2认同)
  • @Grault,即使在这里也确实准确; 见上文,以及BashFAQ#48(http://mywiki.wooledge.org/BashFAQ/048). (2认同)

jfg*_*956 10

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

WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
Run Code Online (Sandbox Code Playgroud)