我得到的工作如下:
for i in {2..10}
do
echo "output: $i"
done
它产生一束线的output: 2
, output: 3
,依此类推。
但是,试图运行以下命令:
max=10
for i in {2..$max}
do
echo "$i"
done
产生如下:
output: {2..10}
我怎样才能让编译器去实现它应该把$最大的阵列的另一端,而不是一个字符串的一部分?
我得到的工作如下:
for i in {2..10}
do
echo "output: $i"
done
它产生一束线的output: 2
, output: 3
,依此类推。
但是,试图运行以下命令:
max=10
for i in {2..$max}
do
echo "$i"
done
产生如下:
output: {2..10}
我怎样才能让编译器去实现它应该把$最大的阵列的另一端,而不是一个字符串的一部分?
括号扩展,{x..y}的其他扩展之前执行,所以不能使用,对于可变长度的序列。
相反,使用seq 2 $max
方法, 用户暴民说 。
所以,你的例子那就是:
max=10
for i in `seq 2 $max`
do
echo "$i"
done
尝试的算术表达式版本for
:
max=10
for (( i=2; i <= $max; ++i ))
do
echo "$i"
done
这是在bash的大多数版本,而应该是Bourne shell的(上海)兼容也。
手动步骤的循环:
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系统使用小额 (1):
for i in $( jot 0 10 ); do echo "output: $i"; done
不止一种方法去做一件事。
max=10
for i in `eval "echo {2..$max}"`
do
echo "$i"
done
如果seq
指挥系统上可用:
for i in `seq 2 $max`
do
echo "output: $i"
done
如果没有,那么用穷人的seq
与perl
:
seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
echo "output: $i"
done
看看那些引号。
这是一种方式:
击:
max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done
上述击方式会为工作ksh
和zsh
太多,当bash -c
替换ksh -c
或zsh -c
分别。
注: for i in {2..${max}}; do echo $i; done
for i in {2..${max}}; do echo $i; done
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
这工作在Mac OS X.
它包括一个BSD日期,如何增加和减少日期还有的例子:
for ((i=28; i>=6 ; i--));
do
dat=`date -v-${i}d -j "+%Y%m%d"`
echo $dat
done
嗯,我没有足够的seq
我的系统上安装Command键(Mac OS X v10.6.1(雪豹)),我结束了使用while
循环,而不是:
max=5
i=1
while [ $max -gt $i ]
do
(stuff)
done
* 耸肩 *无论什么工作。
这些都做{1..8}
和应该都是POSIX。 他们还如果你把一个条件不会破坏continue
在循环。 该规范的方法:
f=
while [ $((f+=1)) -le 8 ]
do
echo $f
done
其他方式:
g=
while
g=${g}1
[ ${#g} -le 8 ]
do
echo ${#g}
done
另有:
set --
while
set $* .
[ ${#} -le 8 ]
do
echo ${#}
done
使用:
max=10
for i in `eval echo {2..$max}`
do
echo $i
done
你需要明确的“EVAL”呼吁重新评估{}后变量替换。