在bash中,是否可以在大括号扩展中使用整数变量

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)

  • 并且也适用于“zsh”(但不适用于“csh”、“tcsh”)。 (2认同)

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 方式

如果您关心可移植性,请使用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 的事情: