And*_*rew 78 shell bash shell-script for
我有以下 bash 脚本:
#!/bin/bash
upperlim=10
for i in {0..10}
do
echo $i
done
for i in {0..$upperlim}
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
第一for回路(没有变量upperlim中的循环控制)工作正常,但所述第二for环路(与可变upperlim的循环控制)没有。有什么办法可以修改第二个for循环以使其正常工作吗?谢谢你的时间。
jor*_*anm 79
这样做的原因是 bash 中事物发生的顺序。大括号扩展发生在变量扩展之前。为了实现您的目标,您需要使用 C 风格的 for 循环:
upperlim=10
for ((i=0; i<=upperlim; i++)); do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
Jod*_*e C 36
要仅使用内置函数以您的风格完成此操作,您必须使用 eval:
d=12
for i in `eval echo {0..$d}`
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
但是seq:
lowerlimit=0
upperlimit=12
for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
我个人认为使用seq更易读。
Cir*_*郝海东 11
POSIX 方式
i=2
END=5
while [ $i -le $END ]; do
echo $i
i=$(($i+1))
done
Run Code Online (Sandbox Code Playgroud)
输出:
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
不是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 Command Language不包含单词let,在bash --posix4.3.42 上失败i=$i+1可能需要美元,但我不确定。POSIX 7 2.6.4 算术扩展说:
如果 shell 变量x包含一个形成有效整数常量的值,可选地包括前导加号或减号,则算术展开
"$((x))"并"$(($x))"应返回相同的值。
但从字面上看并不意味着$((x+1))扩展,因为x+1它不是一个变量。