【发布时间】:2012-03-09 09:33:22
【问题描述】:
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
给我一个名为每周的文件夹。{0..4}
在创建我缺少的文件夹时大括号扩展有什么秘密吗?
【问题讨论】:
标签: bash brace-expansion
WEEKS_TO_SAVE=4
mkdir -p weekly.{0..$WEEKS_TO_SAVE}
给我一个名为每周的文件夹。{0..4}
在创建我缺少的文件夹时大括号扩展有什么秘密吗?
【问题讨论】:
标签: bash brace-expansion
大括号不支持 BASH 中的变量,您可以这样做:
for (( c=0; c<=WEEKS_TO_SAVE; c++ ))
do
mkdir -p weekly.${c}
done
【讨论】:
Brace expansion 不支持。您必须使用 loop 来完成此操作。
大括号扩展在任何其他扩展之前执行,并且任何 结果中保留了其他扩展所特有的字符。它 是严格的文本。 Bash 不应用任何句法解释 到扩展的上下文或大括号之间的文本。到 避免与参数扩展冲突,字符串'${'不是 被认为有资格进行大括号扩展
。
【讨论】:
bash 在variable expansion 之前执行brace expansion,所以你得到weekly.{0..4}。
因为结果是可预测且安全的(不信任用户输入),您可以在您的情况下使用eval:
$ WEEKS_TO_SAVE=4
$ eval "mkdir -p weekly.{0..$((WEEKS_TO_SAVE))}"
注意:
eval 是邪恶的eval
这里,$((..)) 用于强制将变量作为整数表达式求值。
【讨论】:
如果您的机器上碰巧安装了zsh,如果您使用#!/bin/zsh 作为解释器,您编写的代码将与Z-shell 一起工作:
$ WEEKS_TO_SAVE=4
$ echo {0..$WEEKS_TO_SAVE}
0 1 2 3 4
【讨论】:
另一种不使用 eval 并且只调用 mkdir 一次的方法:
WEEKS_TO_SAVE=4
mkdir -p $(seq -f "weekly.%.0f" 0 $WEEKS_TO_SAVE)
【讨论】: