shellwhile比较_shell编程中while与for的区别及效率比较

本文详细介绍了Shell编程中while和for循环的语法结构、使用示例,并通过具体代码展示了它们在处理文件时的区别。在效率方面,通过测试脚本对比,发现while循环中通过`while read LINE`方式读取文件的效率最高。
摘要由CSDN通过智能技术生成

一、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的时候,需要加上

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

Exec 0

While read LINE

Do

Echo $LINE

Exec 0

}

注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3

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

exec 0< $FILENAME

while read LINE

do

echo $LINE

done

exec 0

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值