歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell編程中for/while/until循環命令

shell編程中for/while/until循環命令

日期:2017/3/1 9:18:00   编辑:SHELL編程

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

<use the new IFS value in code>

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 < 10; 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語句行定義多個測試命令,只有最後一個測試命令的退出狀態碼會被用來決定什麼時候介紹循環。

12345678910111213141516171819202122232425262728293031323334353637 [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

Copyright © Linux教程網 All Rights Reserved