![为什么带变量的大括号扩展不能按预期工作?](https://linux22.com/image/166727/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B8%A6%E5%8F%98%E9%87%8F%E7%9A%84%E5%A4%A7%E6%8B%AC%E5%8F%B7%E6%89%A9%E5%B1%95%E4%B8%8D%E8%83%BD%E6%8C%89%E9%A2%84%E6%9C%9F%E5%B7%A5%E4%BD%9C%EF%BC%9F%20.png)
我想在括号中设置一个变量(x=100),例如
x=100
for i in {0.."$x"..50} ;do
echo $i
done
i 的期望输出应该是
0
50
100
虽然我得到作为输出
{0..100..50}
答案1
这在bash
.如果您看到扩展顺序为bash
变量展开发生的时间晚于 shell 展开大括号的时间{0..50}
。因此,在大括号扩展时,shell 会将构造视为{0..$x..50}
无效的扩展构造。
您需要一种替代方法,最好的方法是算术上下文for
中的循环。bash
for ((i=0; i<=100; i+=50)); do
printf "%d\n" "$i"
done
答案2
该语法可以在 zsh(它的来源)或 ksh93 或 中使用yash -o braceexpand
,但不适用于bash
不能在 中使用扩展的地方{x..y}
。但在这里,无论如何使用 ksh93 风格的循环会更好for ((...))
:
x=100
for ((i = 0; i <= x; i += 50)) {
printf '%s\n' "$i"
}