linux shell命令循环执行,shell编程中for/while/until循环命令

一、for命令

在shell编程中,有时我们需要重复执行一直命令直至达到某个特定的条件,bash shell中,提供了for命令,允许你创建一个遍历一系列值的循环,每次迭代都通过一个该系列中的值执行一组预定义的命令。

for的基本格式:

for var in list

do

commands

done

在list中,你提供了迭代中要用的一系列值。在每个迭代中,变量var包含列表中的当前值,第一个迭代会适用列表中的第一个值,第二个迭代使用第二个值,以此类推,直至列表中的所有值都过一遍。

1.1读取列表中的值[root@sh shell]# cat for1.sh

#!/bin/bash

for test in aaa bbb ccc ddd

do

echo the next state is $test

done

[root@sh shell]# sh for1.sh

the next state is aaa

the next state is bbb

the next state is ccc

the next state is ddd

$test变量的值会在shell脚本的最后一次迭代中一直保持有效,除非你修改了它[root@sh shell]# cat for1.sh

#!/bin/bash

for test in aaa bbb ccc ddd

do

echo the next state is $test

done

echo "the last state we visited was $test"

test=fff

echo "wait. now we're visiting $test"

[root@sh shell]# sh for1.sh

the next state is aaa

the next state is bbb

the next state is ccc

the next state is ddd

the last state we visited was ddd

wait. now we're visiting fff

1.2读取列表中的复杂值

在shell脚本中,优势你会遇到难处理的数。下面是个给shell脚本程序员带来麻烦的经典例子:[root@sh shell]# cat for2.sh

#!/bin/bash

for test in I don't know if this'll work

do

echo "word:$test"

done

[root@sh shell]# sh for2.sh

word:I

word:dont know if thisll

word:work

解决办法:使用转义符或者双引号[root@sh shell]# cat for2.sh

#!/bin/bash

for test in I don\'t know if "this'll" work

do

echo "word:$test"

done

[root@sh shell]# sh for2.sh

word:I

word:don't

word:know

word:if

word:this'll

word:work

记住:for循环假定每一个值都是用空格分割的,如果在单独的数字值中有空格,那么你必须使用双引号来将这些值圈起来。

1.3从变量读取列表[root@sh shell]# cat for3.sh

############################

#!/bin/bash

list="aaa bbb ccc ddd eee"

list=$list" Connecticut"

for state in $list

do

echo "Have you ever visited $state"

done

[root@sh shell]# sh for3.sh

Have you ever visited aaa

Have you ever visited bbb

Have you ever visited ccc

Have you ever visited ddd

Have you ever visited eee

Have you ever visited Connecticut

1.4从命令读取值[root@sh shell]# cat for4.sh

#!/bin/bash

file="/root/shell/states"  #如果是在当前不用绝对路径,file=“states”即可

for state in `cat $file`

do

echo "Visit beautiful $state"

done

[root@sh shell]# sh for4.sh

Visit beautiful shanghai

Visit beautiful beijing

Visit beautiful hangzhou

Visit beautiful nanjing

Visit beautiful guangzhou

[root@sh shell]# cat states

shanghai

beijing

hangzhou

nanjing

guangzhou

1.5更改字段分隔符空格;

制表符:

换行符

如果bash shell在数据中看到了这些字符中任意一个,它就会假定你在列表中开始了一个新的数据段。

要解决这个问题,你可以在你shell脚本中临时更改IFS环境变量的值来限制一下被bash shell当作字段分隔符的字符。但这种方式有点奇怪,比如,如果你行IFS的值使其只能识别换行符,你必须这么做:

IFS=$'\n'

将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。[root@sh shell]# cat for5.sh

#!/bin/bash

file="states"

IFS=$'\n'

for state in `cat $file`

do

echo "Visit beautiful $state"

done

[root@sh shell]# sh for5.sh

Visit beautiful shanghai

Visit beautiful beijing

Visit beautiful hangzhou

Visit beautiful nanjing

Visit beautiful guang zhou

Visit beautiful nan ning

Visit beautiful jiang nan

在处理长脚本中,可能在一个地方需要修改IFS的值,然后忘掉它在脚本中其他地方还原默认值。

例如:

IFS.OLD=$IFS

IFS=$'\n'

IFS=$IFS.OLD

其他的IFS值,如:在/etc/passwd中可能用到

IFS=:

也可以赋值多个IFS:

IFS=$'\n:;"'

1.6用通配符读取目录[root@sh shell]# cat for6.sh

#!/bin/bash

for file in /home/*

do

if [ -d "$file" ];then

echo "$file is a directory"

elif [ -f "$file" ];then

echo "$file is a file"

fi

done

[root@sh shell]# sh for6.sh

/home/apache-tomcat-8.0.28.tar.gz is a file

/home/dir1 is a directory

/home/dir2 is a directory

/home/fie1 is a file

/home/fie2 is a file

/home/fie22 is a file[root@sh shell]# cat for7.sh

#!/bin/bash

for file in /home/* /home/badtest

do

if [ -d "$file" ];then

echo "$file is a directory"

elif [ -f "$file" ];then

echo "$file is a file"

else

echo "$file doesn't exist"

fi

done

[root@sh shell]# sh for7.sh

/home/apache-tomcat-8.0.28.tar.gz is a file

/home/dir1 is a directory

/home/dir2 is a directory

/home/fie1 is a file

/home/fie2 is a file

/home/fie22 is a file

/home/badtest doesn't exist

二、C语言风格的for命令

2.1 C语言风格的for命令

C语言的for命令有一个用来指明变量的特殊方法、一个必须保持成立才能继续迭代的条件,以及另一个为每个迭代改变变量的方法。当指定的条件不成立时,for循环就会停止。条件等式通过标准的数字符号定义。

for (i=0; i<10; i++)

{

printf("The next number is %d\n",i):

}

第一部分将一个默认值赋给该变量,中间的部分定义了循环重复的条件,当定义的条件不成立时,for循环就停止迭代,最后一部分定义了迭代的过程。

bash中C语言风格的for循环的基本格式:

for (( variable assignment;condition;iteration process))

for (( a = 1; a < 10; a++ ))

[root@sh shell]# cat c1.sh

#!/bin/bash

for (( i=1; i 

do

echo "The next number is $i"

done

[root@sh shell]# sh c1.sh

The next number is 1

The next number is 2

The next number is 3

The next number is 4

The next number is 5

The next number is 6

The next number is 7

The next number is 8

The next number is 9

2.2使用多个变量

C语言风格的for命令也允许你为迭代使用多个变量。循环会单独处理每个变量,允许你为每个变量定义不同的迭代过程。当你有多个变量时,你只能在for循环中定义一种条件:[root@sh shell]# cat c2.sh

#!/bin/bash

for (( a=1, b=10; a <= 10; a++, b-- ))

do

echo "$a - $b"

done

[root@sh shell]# sh c2.sh

1 - 10

2 - 9

3 - 8

4 - 7

5 - 6

6 - 5

7 - 4

8 - 3

9 - 2

10 - 1

三、while命令

while命令在某种意义上是if-then语句和for循环的混杂体。while命令允许你定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0,它就会在每个迭代的一开始测试test命令,在测试test命令返回非零退出状态码是,while命令会停止执行那组命令。

3.1while的基本格式

while test command

do

other command

done

while命令指定的test命令的退出状态码必须随着循环中运行的命令改变,如果退出状态码从不改变,那么while循环将会一直不停地循环。[root@sh shell]# cat w1.sh

#!/bin/bash

var1=10

while [ $var1 -gt 0 ]

do

echo $var1

var1=$[ $var1 - 1 ]

done

[root@sh shell]# sh w1.sh

10

9

8

7

6

5

4

3

2

1

在这些命令中,测试条件中用到的变量必须被修改,否则你就进入了一个无限循环。

3.2使用多个测试命令

while命令允许你在while语句行定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候介绍循环。[root@sh shell]# cat w2.sh

#!/bin/bash

var1=10

while echo $var1

[ $var1 -ge 0 ]

do

echo "This is inside the loop"

var1=$[ $var1 - 1 ]

done

[root@sh shell]# sh w2.sh

10

This is inside the loop

9

This is inside the loop

8

This is inside the loop

7

This is inside the loop

6

This is inside the loop

5

This is inside the loop

4

This is inside the loop

3

This is inside the loop

2

This is inside the loop

1

This is inside the loop

0

This is inside the loop

-1

在上面的例子中,while语句中定义了两个测试命令:

while echo $var1

[ $var1 -ge 0 ]

在while语句中,在每次迭代中所有的测试命令都会被执行,包括最后一个命令不成立的最后那次循环。注意每个测试命令都是在单独的一行上。

四、until命令

until命令和while命令工作的方式完全相反,until命令要求你指定一个通常输出非零退出状态码的测试命令,只有在测试命令的退出状态码非零,bash shell才会指定循环中列出的那些命令,一旦测试命令返回了退出状态码0,循环就结束了。

4.1 until命令的基本格式

until test commands

do

other    commands

done

4.2until语句中测试多条命令[root@www shell]# cat u1.sh

#!/bin/bash

var1=100

until [ $var1 -eq 0 ]

do

echo $var1

var1=$[ $var1 - 25 ]

done

[root@www shell]# sh u1.sh

100

75

50

25[root@www shell]# cat u2.sh

#!/bin/bash

var1=100

until echo $var1

[ $var1 -eq 0 ]

do

echo Inside the loop:$var1

var1=$[ $var1 -25 ]

done

[root@www shell]# sh u2.sh

100

Inside the loop:100

75

Inside the loop:75

50

Inside the loop:50

25

Inside the loop:25

0

五、if-then-elif-then-fi

if command1

then

command set 1

elif command2

then

command set 2

elif command3

then

command set 3

fi

六、test命令

test命令中列出的条件成立时,test命令会退出并返回退出状态码0,如果条件不成立,test命令就会退出并返回退出状态码1

test命令格式:

test condition(条件)

test和if语句使用的格式:

if test condition

then

commands

fi

跟下面类似

if [ condition ]

then

commands

fi

七、嵌套for循环#!/bin/bash

for (( a = 1; a <= 3; a++ ))

do

echo "Starting loop $a:"

for (( b = 1; b <= 3; b++ ))

do

echo -e "\tInside loop: $b"

done

done

# sh for1.sh

Starting loop 1:

Inside loop: 1

Inside loop: 2

Inside loop: 3

Starting loop 2:

Inside loop: 1

Inside loop: 2

Inside loop: 3

Starting loop 3:

Inside loop: 1

Inside loop: 2

Inside loop: 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值