Linux shell編程模板

只要會寫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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容