Bash脚本for循环大括号范围传参输出{1..10}异常排查
异常原因
Bash解析脚本语句有固定的优先级顺序,大括号扩展{x..y}的执行时机早于变量扩展:
- 执行到
for i in {1..$1}这行时,最先触发大括号扩展逻辑,但此时$1还没被替换成传入的参数10,Bash发现大括号里的范围边界存在未解析的变量,不满足生成序列要求的常量条件,就不会展开成1到10的数字列表,直接保留原字符串格式。 - 等大括号扩展步骤跑完,才轮到变量扩展把
$1替换成10,这时候整个串变成了字面量{1..10},但大括号扩展的流程早就结束了,不会回头再做二次处理,最终for循环只会拿到这一个字符串,输出结果自然就是{1..10}。
修复方案
- 优先用Bash原生C风格for循环,没有兼容性坑,逻辑最直观:
#!/bin/bash for ((i=1; i<=$1; i++)) do echo $i done
- 也可以用
seq命令生成数字序列,写法更简洁:
#!/bin/bash for i in $(seq 1 "$1") do echo $i done
- 不推荐新手使用的
eval写法(存在命令注入风险,仅作原理参考),靠强制二次解析触发大括号扩展:
#!/bin/bash for i in $(eval echo "{1..$1}") do echo $i done
内容的提问来源于stack exchange,提问作者h3xxx
相关产品推荐
相关产品推荐

