shell的循環結構有while和for兩種
for循環
#!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done
echo $i
運行:
ubuntu@ubuntu:~$ ./test.sh 2 4 6 8 10 10 ubuntu@ubuntu:~$
注意最后一次輸出是10,而不是其他語言中輸出4,這一點和JavaScript很類似。
for循環要循環的內容就是跟在in后面,然后以空格分隔,可能要循環的內容特別多,那么就可以將要循環的內容保存在一個文件中,然后讀出來即可。比如下面:
#!/bin/bash #文件名:test.sh for i in `cat test.txt` do echo $i done echo $i
往test.txt中添加一點內容:
ubuntu@ubuntu:~$ echo 1 3 5 7 9 > test.txt ubuntu@ubuntu:~$ ./test.sh 1 3 5 7 9 9 ubuntu@ubuntu:~$
shell默認會將空格、制表符(\t)、換行看做是分隔符,所以:
1、無論內容是以換行或者制表符分隔,for循環都會將其看作是空格分隔,效果上是一樣的。
同時要注意,如果for循環中,集合中的某一項中間包含空格,那么請使用引號將其括起來,因為for循環是以空格分隔的。
前面講for循環和其他語言的for循環形式上的差別很大,但是呢,其實shell中for循環也可以向其他語言那樣是用for,例子如下:
#!/bin/bash #文件名:test.sh for ((i=0;i<4;i++)) do echo $i done
運行:
ubuntu@ubuntu:~$ ./test.sh 0 1 2 3 ubuntu@ubuntu:~$
一定要注意着一種for循環中,使用的是兩對括號,在括號中使用像其他語言的三個表達式的格式。其實着一種for循環的do和done可以換成{ 和 } 。僅限於for循環,其他循環和判斷結構不適用。
自定義分隔符
上面已經說了,shell默認是以空格、制表符、換行進行分隔,那么如果需要強制分隔符是什么時,可以修改IFS這個環境變量。
#!/bin/bash #文件名:test.sh IFS='x' #以x為分隔 #IFS=':' #以:為分隔 #IFS=$'\n' #如果是特殊字符,需要在前面加上$ v="aaaaxbbbbbxcccccxddddd" #其實$v此時的內容是aaaa bbbbb ccccc dddd for s in $v do echo $s done
運行:
ubuntu@ubuntu:~$ ./test.sh aaaa bbbbb ccccc ddddd
while循環
while后面跟着判斷條件,判斷條件可以為多個,但是每一個判斷條件都要是用單獨的 [ ]括起來,然后多個判斷之間使用 &&、||來表示含義。
例子:
#!/bin/bash #文件名:test.sh tot=0 num=10 while [ $num -gt 0 ] do tot=$[ $tot + $num ] num=$[ $num - 1 ] done echo "總和為"$tot
運行結果如下:
ubuntu@ubuntu:~$ ./test.sh 總和為55 ubuntu@ubuntu:~$
until循環
until循環和while循環剛好相反
對於while,如果條件成立,則進入循環,否則條件不成立時,就結束循環。
until則是相反的,如果條件不成立,則進入循環;如果條件成立,則結束循環。
用until改寫上面的例子:
#!/bin/bash #文件名:test.sh tot=0 num=10 #num小於或等於0時,結束循環,否則進入循環 until [ $num -le 0 ] do tot=$[ $tot + $num ] num=$[ $num - 1 ] done echo "總和為"$tot
運行測試結果和上面一樣。