1 shell腳本簡介
在簡單介紹shell腳本(shell script)之前,先簡單介紹一下shell。
1.1 shell簡介
在計算機科學中,shell(殼層)指“為用戶提供用戶界面”的軟件,通常指的是命令行界面的解析器。一般來說,這個詞是指操作系統(tǒng)中,提供訪問內(nèi)核所提供之服務的程序。Shell也用于泛指所有為用戶提供操作界面的程序,也就是程序和用戶交互的接口。因此與之相對的是程序內(nèi)核(英語:Kernel),內(nèi)核不提供和用戶的交互功能。
不過這個詞也拿來指應用軟件,或是任何在特定組件外圍的軟件,例如瀏覽器或電子郵件軟件是HTML排版引擎的shell。Shell這個詞是來自于操作系統(tǒng)(內(nèi)核)與用戶界面的外層界面。
通常將shell分為兩類:命令行與圖形界面。命令行殼層提供一個命令行界面(CLI);而圖形殼層提供一個圖形用戶界面(GUI)。
1.2 shell腳本簡介
shell腳本(英語:shell script),又稱shell命令稿、程序化腳本,是一種電腦程序與文本文件,內(nèi)容由一連串的shell命令組成,經(jīng)由Unix Shell直譯其內(nèi)容后運作。被當成是一種腳本語言來設計,其運作方式與解釋型語言相當,由Unix shell扮演命令行解釋器的角色,在讀取shell腳本之后,依序運行其中的shell命令,之后輸出結(jié)果。利用shell腳本可以進行系統(tǒng)管理,文件操作等。
在Unix及所有的類Unix系統(tǒng)中,如Linux、FreeBSD等操作系統(tǒng),都存在shell腳本。依照Unix shell的各種不同類型,shell腳本也有各種不同方言,如Bourne shell(sh),Bourne-Again shell(bash),C shell(csh)等等。在DOS、OS/2、Microsoft Windows中的批處理文件,跟shell腳本有類似的功能。
2 shell腳本常用循環(huán)語法
常見的shell腳本循環(huán)語法包括for、while和until。除此之外,還有一些其他語法,能夠?qū)崿F(xiàn)循環(huán)(遍歷)功能。和循環(huán)相關的還有循環(huán)控制符break和continue,用于控制流程轉(zhuǎn)向。
2.1 for循環(huán)
for循環(huán)屬于“當型循環(huán)”,即“當滿足條件的時候執(zhí)行”。
2.1.1 for循環(huán)的類型
for循環(huán)有三種類型:
- 列表for循環(huán)
- 類C風格的for循環(huán)
2.1.1.1 列表for循環(huán)
- 數(shù)字for循環(huán)
#!/bin/bash
for value in {1..5}
#for value in 1 2 3 4 5
do
echo "Now value is $value..."
done

- do和done之間的命令稱為循環(huán)體,執(zhí)行次數(shù)和list列表中常數(shù)或字符串的個數(shù)相同。for循環(huán),首先將in后list列表的第一個常數(shù)或字符串賦值給循環(huán)變量,然后執(zhí)行循環(huán)體,以此執(zhí)行l(wèi)ist;最后執(zhí)行do命令后的命令序列。
- shell支持列表for循環(huán)使用略寫的計數(shù)方式,1~5的范圍用{1..5}表示(大括號不能去掉,否則會當作一個字符串處理)。
- shell中還支持按規(guī)定的步數(shù)進行跳躍的方式實現(xiàn)列表for循環(huán),例如計算1~100內(nèi)所有的奇數(shù)之和。
#!/bin/bash
sum=0
for i in {1..100..2}
do
let "sum+=i"
done
echo "sum=$sum"
常見的數(shù)值for循環(huán)語法還有:
#!/bin/bash
for i in $(seq 1 5)
do
echo $(expr $i \* $i + 1);
done

- 字符串for循環(huán)
字符串for循環(huán)和數(shù)字for循環(huán)沒有本質(zhì)區(qū)別,只是形式有細微差別而已。下面列出幾種常見的用法。
- 顯示參數(shù)列表的所有單詞
#!/bin/bash
for i in v1 v2 v3 ;
do
echo value is: $i;
done

- 顯示list中的所有單詞
#!/bin/bash
list="Earth is the Home of Human! ";
for i in $list;
do
echo word is $i;
done

- 傳入?yún)?shù)列表
#!/bin/bash
for i in $* ;
do
echo $i is input value\! ;
done

- 路徑查找for循環(huán)
通過for循環(huán)可以查找指定目錄下的文件列表,并且可以使用通配符。
- 查詢當前目錄下的文件列表
#!/bin/bash
for file in $( ls )
do
echo "file: $file"
done
for file in $( ls )語法的等效語法有很多,如下:
for file in `ls`
或者
for file in *

- 通配符查找指定路徑
#!/bin/bash
for file in /root/*;
do
echo $file;
done

- 通配符查找指定路徑下符合指定擴展名的文件路徑
#!/bin/bash
for file in /root/study/shell/*.sh;
do
echo $file;
done

2.1.1.2 類C風格的for循環(huán)
類C風格的for循環(huán),和C沒有太大的區(qū)別,這里只進行示例,不再贅述。
#!/bin/bash
for((i=1;i<=5;i++));
do
echo $(expr $i \* $i + 1);
done
或者
#!/bin/bash
awk 'BEGIN{
for(i=1; i<=5; i++)
print (i*i+1)
}'
結(jié)果:

2.2 while循環(huán)
也稱為前測試循環(huán)語句,重復次數(shù)是利用一個條件來控制是否繼續(xù)重復執(zhí)行這個語句。為了避免死循環(huán),必須保證循環(huán)體中包含循環(huán)出口條件即表達式存在退出狀態(tài)為非0的情況。例如,計算1~100以內(nèi)所有的奇數(shù)之和:
#!/bin/bash
sum=0
i=1
while(( i <= 100 ))
do
let "sum+=i"
let "i += 2"
done
echo "sum=$sum"
當然,條件可以使字符串,可以是輸入值,可以是標記等,此處不再贅述。
2.3 until循環(huán)
until命令和while命令類似,while能實現(xiàn)的功能until也可以實現(xiàn)。但區(qū)別是until循環(huán)的退出狀態(tài)是為0(與while剛好相反),即whie循環(huán)在條件為真時繼續(xù)執(zhí)行循環(huán),而until則在條件為假時執(zhí)行循環(huán)。
例如,計算1~100以內(nèi)所有的奇數(shù)之和:
#!/bin/bash
i=1
sum=0
until [[ "$i" -gt 100 ]] #直到i大于100
do
let "sum+=i"
let "i += 2"
done
echo "sum=$sum"
2.4 其他可以實現(xiàn)循環(huán)的語法
select結(jié)構(gòu)從技術角度看不能算是循環(huán)結(jié)構(gòu),只是相似而已,它是bash的擴展結(jié)構(gòu)用于交互式菜單顯示,功能類似于case結(jié)構(gòu),但是比case的交互性要好。在遍歷列表功能中,select結(jié)構(gòu)可以實現(xiàn)循環(huán)的功能。
例如,以下選擇,只有選擇white的時候,退出循環(huán)
#!/bin/bash
select color in "red" "blue" "green" "white" "black"
do
echo $color
done

3 循環(huán)控制符
在循環(huán)語法中,經(jīng)常需要根據(jù)條件控制循環(huán)退出或跳過本次執(zhí)行,這時候就需要用到循環(huán)控制符。循環(huán)控制符主要包括兩個:break和continue。
- break:退出本層循環(huán)循環(huán)。
- continue:只退出本次循環(huán),仍然執(zhí)行后繼續(xù)循環(huán)。
循環(huán)控制符和C以及Java等常見語法功能類似,在理不再贅述,只給出常用示例。
3.1 break退出本層循環(huán)
在for、while和until循環(huán)中break可強行退出循環(huán)。
注意:break語句僅能退出當前的循環(huán),如果是兩層循環(huán)嵌套,則需要在外層循環(huán)中使用break。
例如,計算1~100以內(nèi)所有的奇數(shù)之和:
#!/bin/bash
sum=0
for (( i=1; i <= 1000; i+=2))
do
if [ "$i" -lt 100 ]
then
let "sum+=i"
elif [ "$i" -gt 100 ]
then
echo "sum=$sum"
break
fi
done
3.2 continue退出本次循環(huán)繼續(xù)執(zhí)行下一次循環(huán)
在for、while和until中用于讓腳本跳過其后面的語句,執(zhí)行下一次循環(huán)。
例如,顯示10以內(nèi)能被3整除的正整數(shù)。
#!/bin/bash
for (( i=1; i < 10; i++ ))
do
let "tmp=i%3" #被3整除
if [ "$tmp" -ne 0 ]
then
continue
fi
echo -n "$i "
done
echo ""
4 小結(jié)
以上是自己在學習Linux的過程中的一部分總結(jié),和大家共享。同時,也參考了其他人的博客,在參考列表中列出來了。