一、for循环:

语法结构:
1、for 变量 in seq字符串

2、for 变量 in `command`  " "

3、for 变量 in "$@"或“$*”

4、for((赋值;条件;运算语句))


说明:for是用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。


echo "####################################"
for i in $(seq 3 10); do
   echo $i;
done;

echo "####################################"
for i in a b c d e; do
   echo $i;
done;:

echo "####################################"
for i in $@; do
   echo $i;
done;

echo "####################################"
for i in $*; do
   echo $i;
done;

echo "####################################"
for((i=1;i<=10;i++));do
   echo $i;
done;

echo "####################################"
for i in `cat /etc/passwd`; do
   echo $i;
done;

echo "####################################"
for i in $(cat /etc/passwd); do
   echo $i;
done;



二、while循环:

语法结构:

1、while [ $i -lt num ]

2、while true

3、while read a b c; do command done < filename

4、cat filename | while read a b c


echo "##################################"
while read line
do
echo $line
done < a

echo "###################################"
cat a | while read line
do
echo $line
done

i=0
echo "###################################"
while [ $i -lt 5 ]
do
echo $i
done

echo "###################################"
while true
do
echo $i
done



三、shell编程中while与for的区别:

shell编程中常用的循环:while 和 for,在使用的过程中,会发现一些差别。
 1. 代码


1 #!/bin/bash
2
3 # while loop
4 echo -en "\t";date
5 cat abc.txt|while read user ip
6 do
7 {
8     ssh -o ConnectTimeout=10 $user@$ip "hostname" < /dev/null
9     sleep 10s
10 } &
11 done
12 wait
13 echo "This is while loop."
14 echo -en "\t";date
15
16 sleep 10s
17 echo -e "\n"
18
19 # for loop
20 echo -en "\t";date
21 for line in `cat abc.txt|sed -e 's/ /--/g'`
22 do
23 {
24     user=`echo $line|awk -F '--' '{print $1}'`
25     ip=`echo $line|awk -F '--' '{print $2}'`
26     ssh -oConnectTimeout=10 $user@$ip "hostname"
27     sleep 10s
28 } &
29 done
30 wait
31 echo "This is for loop."
32 echo -en "\t";date
View Code


2. 总结

从代码可以看出 ,

while循环: 以行读取文件,默认分隔符是空格或者Tab; 循环体内有ssh、scp、sshpass的时候,需要加上</dev/null ( 不加的话,执行一次循环就退出 )

for循环: 以空格读取文件,也就是碰到空格,就开始执行循环体,所以需要以行读取的话,就要把空格转换成其他字符


从执行结果可以看出 ,
while循环: wait没起到作用,循环体在后台执行,后面的命令也同时在执行;
for循环: 循环体在后台执行,等待循环体全部执行结束,后面的命令接着执行。

四、while和for循环效率比较:

在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。

方法1:while循环中执行效率最高,最常用的方法。

function while_read_LINE_bottm(){
While read LINE
do
echo $LINE
done  < $FILENAME
}

       注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。

方法2 : 重定向法;管道法: cat $FILENAME | while read LINE

Function While_read_LINE(){
cat $FILENAME | while read LINE
do
echo $LINE
done
}
         注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。

方法3: 文件描述符法

Function while_read_line_fd(){
Exec 3<&0
Exec 0<$FILENAME
While read LINE
Do
Echo $LINE
Exec 0<&<3
}

       注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。

方法4    for  循环

function  for_in_file(){
For  i  in  `cat $FILENAME`
do
echo $i
done
}
         注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。


   对各个方法进行测试,看那方法的执行效率最高。

         首先我们用脚本进行测试,一个100000的文件,然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。


#!/bin/bash
FILENAME="$1"
TIMEFILE="/tmp/loopfile.out" > $TIMEFILE
SCRIPT=$(basename $0)

function usage(){
echo -e "\nUSAGE: $SCRIPT file \n"
exit 1
}

function while_read_bottm(){
while read LINE
do
echo $LINE
done < $FILENAME
}

function while_read_line(){
cat $FILENAME | while read LINE
do
echo $LINE
done
}

function while_read_line_fd(){
exec 3<&0
exec 0< $FILENAME
while read LINE
do
echo $LINE
done
exec 0<&3
}

function for_in_file(){
for i in  `cat $FILENAME`
do
echo $i
done
}

if [ $# -lt 1 ] ; then
usage
fi
echo -e " \n starting file processing of each method\n"
echo -e "method 1:"
echo -e "function while_read_bottm"
time while_read_bottm >> $TIMEFILE
echo -e "\n"

echo -e "method 2:"
echo -e "function while_read_line "
time while_read_line >> $TIMEFILE

echo -e "\n"
echo -e "method 3:"
echo "function while_read_line_fd"
time while_read_line_fd >>$TIMEFILE

echo -e "\n"
echo -e "method 4:"
echo -e "function  for_in_file"
time  for_in_file >> $TIMEFILE



测试结果如下:

1、100000行的文件:


method 1:
function while_read_bottm

real    0m3.035s
user    0m2.535s
sys     0m0.497s

method 2:
function while_read_line

real    0m3.508s
user    0m2.517s
sys     0m0.981s

method 3:
function while_read_line_fd

real    0m3.046s
user    0m2.450s
sys     0m0.582s

method 4:
function  for_in_file

real    0m4.256s
user    0m3.308s
sys     0m0.940s


由上可见,在while循环中读写文件时,效率最高。
while read LINE
do
echo $LINE

done < $FILENAME