標籤:bash shell 指令碼
一 注意事項
1.指令碼的開頭一行為 :
#!/bin/bash
聲明這個指令碼需要的shell的名稱
2.程式中出了"#!"之外的其他以#開頭的都是注釋內容
3.為了方面的使用系統命令,可以在程式的開始部分設定主要環境變數例如PATH
4.指令碼程式的運行方法:
- sh example.sh 或者類似 bash example.sh
- chmod +x example.sh ; ./example.sh ################################ 這兩種執行方式都是在建立的子進程中完成的
- source example.sh 或者 . example.sh 則是在父進程中直接執行命令的
二 簡單指令碼2.1 互動式指令碼,處理簡單的輸入輸出
首先是讀取使用者輸入的read命令,輸出的命令就是echo ,例如:
read -p ‘please input your first name: ‘ firstname
echo ‘your first name is : $firstname‘
shell中變數是沒有申明比較隨意不需要指定類型,在引用的時候, $變數名 或者是 ${變數名}
除了這種方式之外就是通過執行指令碼時的參數的傳遞,在shell中參數名是內建的$0,$1,$2,$4...
這裡$0表示檔案名稱,$1開始表示第一個參數,其他依次類推. 初次之外還有其他特殊的參數名,如下:
- $# : 表示參數個數
- [email protected]:代表"$1","$2" ... 之意
- $*:代表"$1 $2 $3 ..." 之意
eg:
#!/bin/bashecho 'filename:'$0echo 'args size: '$#echo 'first arg:'$1
2.2 數值運算shell只能夠支援整數的基本運算:+ - * / %
1).declare - i var 可以將變數聲明為整數,然後對變數進行運算,變數運算是這樣的:$((計算式)) eg:
declare -i v1declare -i v2v3=$(($v1 + $v2))#也可以這樣計算:declare -i v3=$v1*$v2 #運算式之間不能有空格
2).var=$((運算內容)) //運算內容中間是允許有空格的 eg:
echo $ (( 19 + 78))
2.3 shell中的判斷式
shell中可以用test命令進行判斷,eg:
test -e ./example.sh #測試檔案是否存在
常見測試類型和參數如下:來自鳥哥的Linux私房菜
除了可以用test命令進行條件判斷之外i,還可以用[] (中括弧的文法進行判斷,判斷測試參數和test一樣).
[]文法要求[]內的所有量之間均有空格,eg:
[b"$name"b==b"xiaoyi"b] #b都表示空格
三 複雜指令碼3.1 條件陳述式if else 的標準格式:
if [ 條件判斷1 ] ; then command1elif [ 條件判斷2 ] ; then command2else command3fi
其中,條件可以用&&或者||進行串連
case...esac的標準格式如下:
case $variableName in "第一個變數內容") 程式段 ;; #每個類型的結尾類似break"第二個變數內容") 程式段 ;; *)# 類似default 用* 代替 其他不合格程式段 ;;esac
3.2 迴圈語句迴圈的幾種格式如下:
- while do done
while [ condition ]do 程式段done
- until do done
until [ condition ]do 程式段done
- for...do...done
for var in cond1 cond2 cond3 ...do 程式段donefor ((初始值;限制值;執行步長))do 程式段done
3.3 函數
function fname(){ 程式段}
examples:
#!/bin/bash# if --- else -- exmapledeclare -i v1=10declare -i v2=15if [ $v1 -ge $v2 ] ; thenecho ''$v1' is bigger than '$v2''else echo ''$v1' is smaller than '$v2''fi# case ... esac exampleread -p 'Please input your name : ' namecase $name in"xiaoyi")echo 'hello xiaoyi';;"xiaoyi1")echo 'hello xiaoyi1';;*)echo 'no case matched!';;esac# loop exampledeclare lv=1 while [ $lv -le 10 ]doecho $lvlv=$((${lv}+1))doneuntil [ $lv -le 1 ]doecho $lvlv=$((${lv}-1))donefor c in 'c1' 'c2' 'c3'doecho $cdonefor ((i=0;i<10;i=i+1))doecho $idone function printHello(){echo 'hello'}printHello
鳥書shell學習(三)shell指令碼程式設計要點總結