最近在做脚本练习
其中用到数字变量迭代
本来打算用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)
本文探讨了Bash脚本中使用brace expansion进行迭代时遇到的问题,并对比了预期输出与实际结果之间的差异。通过分析,作者提供了两种解决方案:一是利用seq命令,二是采用C风格的for循环。此外,还提及了zsh解释器对此问题的不同处理方式。
1378

被折叠的 条评论
为什么被折叠?



