我有以下 bash 脚本:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
第一个for
循环(没有upperlim
循环控制中的变量)工作正常,但是第二个for
循环(和循环控制中的变量upperlim
)则不然。有什么方法可以修改第二个for
循环以使其正常工作吗?谢谢你的时间。
答案1
原因是 bash 中事件发生的顺序。发生大括号扩展前变量被扩展。为了实现你的目标,你需要使用 C 风格的 for 循环:
upperlim=10
for ((i=0; i<=upperlim; i++)); do
echo "$i"
done
答案2
要以您的风格仅使用内置函数来完成此操作,您必须使用 eval:
d=12
for i in `eval echo {0..$d}`
do
echo $i
done
但与seq
:
lowerlimit=0
upperlimit=12
for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done
就我个人而言,我发现使用seq
更具可读性。
答案3
POSIX 方式
如果您关心便携性,请使用POSIX 标准的示例:
i=2
END=5
while [ "$i" -le "$END" ]; do
echo "$i"
i=$(($i+1))
done
输出:
2
3
4
5
事物是不是POSIX:
(( ))
没有美元,尽管它是常见的扩展正如 POSIX 本身所提到的。[[
。[
这里就足够了。也可以看看:https://stackoverflow.com/questions/13542832/bash-if-difference- Between-square-brackets-and-double-square-bracketsfor ((;;))
seq
{start..end}
,并且不能与提到的变量一起使用通过 Bash 手册。let i=i+1
:POSIX 7 2. Shell 命令语言不包含单词,并且在4.3.42let
上失败bash --posix
可能需要美元
i=$i+1
,但我不确定。POSIX 7 2.6.4 算术扩展说:如果 shell 变量X包含一个形成有效整数常量的值,可选地包括前导加号或减号,然后算术扩展
"$((x))"
和"$(($x))"
应返回相同的值。但从字面意思上看并不意味着
$((x+1))
展开式因为x+1
不是变量。
答案4
for i in $(seq ${1:-1} ${2:-10}); do
echo $i
done
i=${1:-1}
while (( $i <= ${2:-10} )); do
echo $i
i=$(($i + 1))
done