標籤:shell 指令碼 函數 數組
一 shell 中的函數
1 先瞭解指令碼的幾個系統變數
$# 是傳給指令碼的參數個數$0 是指令碼本身的名字$1 是傳遞給該shell指令碼的第一個參數$2 是傳遞給該shell指令碼的第二個參數[email protected] 是傳給指令碼的所有參數的列表$* 是以一個單字串顯示所有向指令碼傳遞的參數,與位置變數不同,參數可超過9個$$ 是指令碼啟動並執行當前進程ID號$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
2 函數的定義及用法
函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可。格式: function f_name() { command }函數必須要放在最前面,其中關鍵字function可以省略
樣本1
vim 6.sh#!/bin/bashinput() { echo $1 $2 $# $0}input 4 4 4 4 4
執行結果為: 4 4 5 6.sh
$1 $2 標示傳遞個shell指令碼的第一個,第二個參數
$# 標示傳遞給指令碼的參數個數
$0 是指令碼本身的名字
樣本2
#!/bin/bashsum(){s=$[$1+$2]echo $s}sum 1 2
如果要在指令碼外面傳入參數,sum 1 2 可以改為sum $1 $2,然後執行指令碼時帶上參數,比如 sh sum.sh 1 2
樣本3
需求,寫一個指令碼,給出網卡名稱,就能顯示對應的ip地址
指令碼調試
ifconfig |grep ens33 -A1 |grep ‘inet‘ |awk ‘{print $2}‘
各段含義:
ifconfig 不用說了,可以查看網卡相關資訊
grep enss3 -A1 過濾出含有網卡名稱ens33 的行,並順帶列印其下一行。也就是我們需要的ip地址行
grep ‘inet‘ 找出還有ip地址的行,這裡可以使用tail -1代替
awk ‘{print $2}‘ 列印ip地址行的第二段,也就是ip地址了,awk不指定分隔字元,預設以空格或者tab分割。也就是以Null 字元分割。
最終結果
#!/bin/baship(){ifconfig |grep "$1: " -A1 |grep ‘inet‘ |awk ‘{print $2}‘}read -p "please input a name of network card: " nameip $name
備忘:grep命令後面的$1表示函數傳遞的第一個參數,一定要用雙引號。
對上面指令碼做一個完善,
1 判斷該網卡名是否為系統裡的網卡,不是給出提示
2 判斷該網卡是否分配了ip地址,沒有給出提示
#!/bin/baship(){ifconfig |grep "$1: " -A1 |grep ‘inet‘|awk ‘{print $2}‘}read -p "please input a name of network card: " nameip $namen=`ifconfig |grep "$name"`if [ -z "$n" ];then echo "the eth is not exist"fim=`ifconfig |grep "$name" -A1 |grep ‘inet‘`if [ -z "$m" ];then echo "the eth has no ip assigned"fi
二 shell中的數組
定義數組 a=(1 2 3 4 5)
echo ${a[@]} // 顯示整個數組,等價於echo ${a[*]}
echo ${#a[@]} 擷取數組的元素個數
echo ${a[2]} 讀取第三個元素,數組元素編號從0開始
數組賦值
a[1]=100; echo ${a[@]}
a[5]=2; echo ${a[@]} 如果下標不存在則會自動添加一個元素
數組的刪除
unset a[1] ;echo ${a[*]} //刪除數組中第1個元素
unset a;echo ${a[*]} //清空數組
數組分區
a=(`seq 1 5`)
echo ${a[@]:0:3} 從第一個元素開始,截取3個
echo ${a[@]:1:4} 從第二個元素開始,截取4個
echo ${a[@]:0-3:2} 從倒數第3個元素開始,依次向後截取2個
數組替換
echo ${a[@]/3/100} //將數組a中的3替換成100(只顯示到螢幕,並不更改數組)
a=(${a[@]/3/100}) //將數組a中的3替換成100 ( 更改數組)
Linux學習總結(六十)shell指令碼4-函數及數組