Bash脚本中如何在花括号范围表达式内使用变量?
解决批量启动LXC容器时变量生成序列的问题
bash的花括号展开(比如{01..20})是在参数展开前执行的,所以直接写{01..$1}时,脚本参数$1还没被解析,花括号无法生成预期的带前导零的序列。以下是几种可行的解决方法:
方法一:使用seq命令(推荐)
seq的-w参数可以自动补前导零,生成宽度一致的序列:
for i in $(seq -w 1 "$1"); do lxc start "server$i" done
-w会根据最大数字的长度补零,比如当$1=20时,输出就是01、02……20。
方法二:用printf格式化数字
通过循环配合printf生成带前导零的字符串:
for ((i=1; i<="$1"; i++)); do num=$(printf "%02d" "$i") lxc start "server$num" done
%02d指定输出两位数字,不足两位时前面补零,如果你需要更多位数,把2改成对应数字即可(比如%03d生成三位带零的序列)。
方法三:使用eval(需注意安全)
如果你的脚本参数$1是完全可控的(不会传入恶意内容),可以用eval先解析变量再展开花括号:
eval "for i in {01..$1}; do lxc start server\$i; done"
eval会先把{01..$1}中的$1替换为实际数值,再执行花括号展开,但这种方式存在安全风险,不推荐用于处理不可信输入。
内容的提问来源于stack exchange,提问作者josrrp
相关产品推荐
相关产品推荐

