Bash中能否在大括号扩展中展开变量生成序列?
能否在Bash的大括号扩展中使用变量?
答案是:默认情况下不行,但可以通过间接方式实现。
为什么直接写{1..$rangeEnd}不生效?
Bash的各种扩展是有固定顺序的,大括号扩展是最先执行的步骤之一,早于变量/参数扩展。这意味着当Shell处理{1..$rangeEnd}时,$rangeEnd还只是一个字符串,不会被替换成它的值,所以最终输出的就是原封不动的{1..10},而不是展开后的序列。
用eval实现大括号扩展结合变量
如果你一定要用大括号扩展来完成这个需求,可以借助eval命令——它会重新解析命令行,先完成变量替换,再执行大括号扩展:
rangeEnd=10 eval echo {1..$rangeEnd}
执行后就能得到预期的输出:1 2 3 4 5 6 7 8 9 10。
⚠️ 注意:eval会执行任何传入的命令,所以如果rangeEnd的值来自不可信输入(比如用户输入、外部文件),可能会带来安全风险。比如如果rangeEnd被设置为10}; rm -rf /;,后果不堪设想,使用时一定要谨慎。
其他替代方案(不用eval)
如果不想冒eval的风险,除了你提到的seq方法:
echo $(seq 1 $rangeEnd)
还可以用Bash的C风格循环来生成序列:
# 纯Bash实现,不依赖外部工具seq for ((i=1; i<=rangeEnd; i++)); do echo -n "$i "; done; echo
另外提一句:如果你用的是Zsh而不是Bash,它原生支持在大括号扩展中使用变量,直接写{1..$rangeEnd}就能正常展开。
内容的提问来源于stack exchange,提问作者derek
相关产品推荐
相关产品推荐

