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

一、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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值