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

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

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

4

5 回答 5

12

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

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

注意

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

在这里,$((..))用于强制将变量评估为整数表达式。

于 2012-02-18T04:21:37.977 回答
11

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

 for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
 do
    mkdir -p weekly.${c}
 done
于 2012-02-18T01:05:34.363 回答
10

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

WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
于 2012-02-18T11:45:31.527 回答
2

大括号扩展不支持它。您将不得不使用循环来完成。

大括号扩展在任何其他扩展之前执行,并且任何其他扩展的特殊字符都保留在结果中。它是严格的文本。Bash 不对扩展的上下文或大括号之间的文本应用任何句法解释。为避免与参数扩展发生冲突,字符串 '${' 不适合大括号扩展

.

于 2012-02-18T01:07:45.017 回答
1

如果你碰巧zsh安装在你的盒子上,你编写的代码与 Z-shell 一起使用,如果你使用#!/bin/zsh你的解释器:

例子

$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4
于 2012-02-18T05:14:57.580 回答