只要會寫Linux命令,就可以寫shell腳本。
之前基本上寫的shell腳本都是Linux命令的組合,最多加入if else或while循環(huán),連函數(shù)都沒過。
最近發(fā)現(xiàn)shell函數(shù)還是有必要的,而且函數(shù)一般是抽象后的,可以反復調(diào)用,大大簡化了腳本。
先上個模板,然后依依拆解,后續(xù)如何套用模板。
簡單模板
#!/usr/bin/bash
function funname(){
? ? ? echo "第一個參數(shù) $1"
? ? ? echo "第一個參數(shù) ${10}"
? ? ? action
? ? ? return int
}
function ifelse(){
if condition1
then
? ? command1
elif condition2
then
? ? command2
else
? ? commandN
fi
}
function whiledone(){
while condition
do
? ? command
done
}
function caseesac(){
case 值 in
模式1)
? ? command1
? ? ...
? ? commandN
? ? ;;
模式2)
? ? comman1
? ? ...
? ? commandN
? ? ;;
esac
}
funname test robot boy
簡單示例
#!/usr/bin/bash
contain=("test" "robot" "boy")
function query(){
? ? echo " 這是第一個參數(shù) $1 "
? ? if? [ $1 == "test" ]
? ? then
? ? ? ? echo "輸入?yún)?shù)$1 是test"
? ? ? ? num=`docker ps | grep $1 | wc -l`
? ? ? ? name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
? ? elif [ $1 == "robot"? ]
? ? then
? ? ? ? echo "輸入?yún)?shù)$1 是robot"
? ? ? ? num=`docker ps | grep $1 | wc -l`
? ? ? ? name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
? ? else
? ? ? ? echo "輸入?yún)?shù)$1 既不是test,也不是robot"
? ? ? ? num=`docker ps | grep $1 | wc -l`
? ? ? ? name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
? ? ? ? fi
}
function main(){
? ? for i in ${contain[*]}
? ? do
? ? ? ? ? query $i
? ? ? ? ? echo $num
? ? ? ? ? echo $name
? ? done
}
main
shell 定義一個數(shù)組
Bash Shell 只支持一維數(shù)組(不支持多維數(shù)組),初始化時不需要定義數(shù)組大小。數(shù)組元素的下標由 0 開始。
Shell 數(shù)組用括號來表示,元素用"空格"符號分割開,語法格式如下
array_name=(value1 value2 ... valuen)
獲取數(shù)組中所有元素${array_name[*]}或${array_name[@]}
獲取數(shù)組長度的方法${#array_name[*]}或${#array_name[@]}
a=(f1 f2 f3 f4)
for i in ${a[*]}或for i in ${a[@]}
shell定義一個函數(shù)
function funname(){
? ? ? echo "第一個參數(shù) $1"
? ? ? echo "第一個參數(shù) ${10}"
? ? ? action
? ? ? return int
}
return后跟數(shù)值n(0-255),如果不加,將以最后一條命令的運行結果作為返回值。
函數(shù)傳參:在Shell中,調(diào)用函數(shù)時可以向其傳遞參數(shù)。在函數(shù)體內(nèi)部,通過 $n 的形式來獲取參數(shù)的值。注意,$10 不能獲取第十個參數(shù),獲取第十個參數(shù)需要${10}。當n>=10時,需要使用${n}來獲取參數(shù)。
$#? 傳遞到腳本或函數(shù)的參數(shù)個數(shù)
$* 以單字符串顯示向腳本傳遞的所有參數(shù)
$$ 腳本運行的當前進程ID號
$! 后臺運行的最后一個進程的ID號
$@? 與$*相同,但是使用時加引號,并在引號中返回每個參數(shù)。
$- 顯示Shell使用的當前選項,與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤。
if elif else fi條件
if condition
then
? ? command1
? ? ...
? ? commandN
fi
if condition1
then
? ? command1
elif condition2
then
? ? command2
else
? ? commandN
fi
for循環(huán)
for i in itm itm2 itm3
do
? ? echo $i
done
while循環(huán)
while condition
do
? ? command
done
break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))。continue命令與break命令類似,它不會跳出所有循環(huán),僅僅跳出當前循環(huán)。
case ... esac
多選擇語句,與其他語言中的switch ... case語句類似,是一種多分枝選擇結構,每個 case 分支用右圓括號開始,用兩個分號 ;; 表示 break,即執(zhí)行結束,跳出整個 case ... esac 語句,esac(是case反過來)作為結束標記。
case 值 in
模式1)
? ? command1
? ? ...
? ? commandN
? ? ;;
模式2)
? ? comman1
? ? ...
? ? commandN
? ? ;;
esac
Shell 文件引用
和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。
Shell 文件包含的語法格式如下:
. filename? # 注意點號(.)和文件名中間有一空格
或source filename