eyk*_*nal 182 unix syntax shell
我有以下工作:
for i in {2..10}
do
echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)
它产生一束线output: 2,output: 3,等.
但是,尝试运行以下内容:
max=10
for i in {2..$max}
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
产生以下内容:
output: {2..10}
Run Code Online (Sandbox Code Playgroud)
如何让编译器实现它应该将$ max视为数组的另一端,而不是字符串的一部分?
wha*_*ame 222
支撑扩展,{x..y}在其他扩展之前执行,因此您不能将其用于可变长度序列.
相反,使用该seq 2 $max方法作为用户暴徒声明.
所以,对于你的例子,它将是:
max=10
for i in `seq 2 $max`
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
sys*_*USE 68
尝试以下算术表达式for:
max=10
for (( i=2; i <= $max; ++i ))
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
这在大多数版本的bash中都可用,并且也应该与Bourne shell(sh)兼容.
Nie*_*jou 27
手动循环:
i=0
max=10
while [ $i -lt $max ]
do
echo "output: $i"
true $(( i++ ))
done
如果你没有完全POSIX,您可以用算术的循环:
max=10 for (( i=0; i < max; i++ )); do echo "output: $i"; done
或者在BSD系统上使用jot(1):
for i in $( jot 0 10 ); do echo "output: $i"; done
如果seq您的系统上有可用的命令:
for i in `seq 2 $max`
do
echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)
如果没有,那么用穷人的seq有perl:
seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
echo "output: $i"
done
Run Code Online (Sandbox Code Playgroud)
看那些引号.
有不止一种方法可以做到这一点.
max=10
for i in `eval "echo {2..$max}"`
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
这是一种方式:
Bash:
max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done
Run Code Online (Sandbox Code Playgroud)
上面的 Bash 方式也适用于kshand zsh,当分别bash -c替换为ksh -c或 时zsh -c。
注意:for i in {2..${max}}; do echo $i; done适用于zsh和ksh。
我们可以像 C 编程一样迭代循环。
#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
821543 次 |
| 最近记录: |