1 先了解腳本的幾個系統變量shell
$# 是傳給腳本的參數個數 $0 是腳本自己的名字 $1 是傳遞給該shell腳本的第一個參數 $2 是傳遞給該shell腳本的第二個參數 $@ 是傳給腳本的全部參數的列表 $* 是以一個單字符串顯示全部向腳本傳遞的參數,與位置變量不一樣,參數可超過9個 $$ 是腳本運行的當前進程ID號 $? 是顯示最後命令的退出狀態,0表示沒有錯誤,其餘表示有錯誤
2 函數的定義及用法
函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字便可。格式: function f_name() { command }函數必需要放在最前面,其中關鍵字function能夠省略
示例1 vim
vim 6.sh #!/bin/bash input() { echo $1 $2 $# $0 } input 4 4 4 4 4
sh執行結果爲: 4 4 5 6.sh
$1 $2 標示傳遞給shell腳本的第一個,第二個參數
$# 標示傳遞給腳本的參數個數
$0 是腳本自己的名字,若是用./執行的話,$0會跟執行腳本時所在路徑。
示例2數組
#!/bin/bash sum() { 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 ens33 -A1 |awk '/inet/ {print $2}'
各段含義:
ifconfig 不用說了,能夠查看網卡相關信息
grep enss3 -A1 過濾出含有網卡名稱ens33 的行,並順帶打印其下一行。也就是咱們須要的ip地址行
grep 'inet' 找出還有ip地址的行,這裏能夠使用tail -1代替
awk '{print $2}' 打印ip地址行的第二段,也就是ip地址了,awk不指定分隔符,默認以空格或者tab分割。也就是以空字符分割。
最終結果bash
#!/bin/bash ip() { ifconfig |grep "$1: " -A1 |grep 'inet' |awk '{print $2}' } read -p "please input a name of network card: " name ip $name
備註:grep命令後面的$1表示函數傳遞的第一個參數,必定要用雙引號。
對上面腳本作一個完善,
1 判斷該網卡名是否爲系統裏的網卡,不是給出提示
2 判斷該網卡是否分配了ip地址,沒有給出提示ide
#!/bin/bash ip() { ifconfig |grep "$1: " -A1 |grep 'inet'|awk '{print $2}' } read -p "please input a name of network card: " name ip $name n=`ifconfig |grep "$name"` if [ -z "$n" ];then echo "the eth is not exist" fi m=`ifconfig |grep "$name" -A1 |grep 'inet'` if [ -z "$m" ];then echo "the eth has no ip assigned" fi
定義數組 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 ( 更改數組)函數