最近在做脚本练习
其中用到数字变量迭代
本来打算用for .. in
语句实现
但是结果让我疑惑
这里简单记录下过程
原始代码
#!/bin/bash
line=3
echo "the line's value is: $line"
for i in {1..$line};do
echo $i
done
输出
the line's value is: 3
{1..3}
预想输出应该是逐行顺序输出1, 2, 3才对
原因
{ }
叫做 brace expansion
最早是出现在 csh
(二十世纪七十年代) 中,bash
、zsh
则是在二十世纪八十年代末九十年代初加入对它的支持
起初的版本用作字符段替代,比如 touch a{sean,linus}b
会同时生成两个文件
{1..6}
这种用法则是 zsh(1995, 2.6-beta4)
中,bash(2004, 3.0)
它的优先级比变量扩展更高
所以 for i in {1..$line}
中大括号部分被当作一个整体来处理
解决办法
方法一:使用 seq
for i in $(seq 1 1 $line)
方法二:使用 C语言格式
for (( i = 1; i < $line; i++ ))
👉补充
zsh(5.8.1)
测试可以正常实现 {1..$VAR}
Zsh YYDS!!!
参考链接
difference between for i in {1..$N}
and for i in $(seq 1 1 $N)