shell-4

chunyang315發表於2018-04-23

shell中的函式

  • 函式就是把一段程式碼整理到一個小單元中,並給這個小單元起一個名字,當用到這段程式碼時直接呼叫這個小單元的名字即可。

  • 格式

function f_name(){    //f_name是函式名字
      command 
      } 

函式必須要放在最前面,在寫指令碼時,可以省略function
示例:列印引數

#!/bin/bash
inp(){
  echo "The first par is  $1"
  echo "The second par is  $2"
  echo "The third par is  $3"
  echo "the scripts par is $0"
  echo "the number for par is  $#"
  } 
  inp $1 $2 $3  //定義指令碼引數
 [root@zcy-1 sbin]# cat inp.sh 
#!/bin/bash
inp(){
  echo "The first par is  $1"
  echo "The second par is  $2"
  echo "The third par is  $3"
  echo "the scripts par is $0"
  echo "the numberpar is  $#"
  } 
  inp  $1  $2  $3 
[root@zcy-1 sbin]# 
[root@zcy-1 sbin]# sh inp.sh  2
The first par is  2
The second par is  
The third par is  
the scripts par is inp.sh
the numberpar is  1
[root@zcy-1 sbin]# sh inp.sh  3  1
The first par is  3
The second par is  1
The third par is  
the scripts par is inp.sh
the numberpar is  2
[root@zcy-1 sbin]# 

-案例2 定義加法的函式

[root@zcy-1 sbin]# cat 11.sh 
#!/bin/bash
sum() {
  s=$[$1+$2] /s指變數
  echo $s
}
 sum 1 7
[root@zcy-1 sbin]# sh -x 11.sh 
+ sum 1 7
+ s=8
+ echo 8
8
[root@zcy-1 sbin]# sh  11.sh 
8
  • 案例 顯示網路卡的IP地址
#!/bin/bash
ip(){
    ifconfig |grep -A1 "$1" |grep 'inet' |awk '{print $2}'
     }
     read -p "Please input the ens name:" ens
     ip $ens

拆分解析

[root@zcy-1 shell]# ifconfig |grep -A1 "ens"
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.244.136  netmask 255.255.255.0  broadcast 192.168.244.255
--
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.202.139  netmask 255.255.255.0  broadcast 192.168.202.255
[root@zcy-1 shell]# 
[root@zcy-1 shell]# ifconfig |grep -A1 "ens" |grep 'inet' 
        inet 192.168.244.136  netmask 255.255.255.0  broadcast 192.168.244.255
        inet 192.168.202.139  netmask 255.255.255.0  broadcast 192.168.202.255
[root@zcy-1 shell]# 
[root@zcy-1 shell]# ifconfig |grep -A1 "ens" |grep 'inet' |awk '{print $2}'
192.168.244.136
192.168.202.139
[root@zcy-1 shell]# 
[root@zcy-1 shell]# 

執行結果

[root@zcy-1 shell]# sh -x fun1.sh 
+ read -p 'Please input the ens name:' ens
Please input the ens name:ens
+ ip ens
+ ifconfig
+ grep -A1 ens
+ grep inet
+ awk '{print $2}'
192.168.244.136
192.168.202.139
[root@zcy-1 shell]# 

shell中的陣列 ##

  • 陣列就是一串字串或者一串數字形成的變數,把這個變數叫做陣列,那麼就可以針對陣列進行一些操作。陣列很有用,但是使用場景不多。

  • 定義陣列a=(1 2 3 4 5) ; echo ${a[@]}
    例:

[root@zcy-1 shell]# b=(1 3 5)
[root@zcy-1 shell]# echo $b 
1
[root@zcy-1 shell]# echo ${b[@]} /[ ] 裡面也可以使用*
1 3 5
[root@zcy-1 shell]# 
  • 檢視陣列中某一個元素的值,預設從0開始
[root@zcy-1 shell]# b=(1 2 3)
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${b[2]}
3
[root@zcy-1 shell]# echo ${b[0]}
1
[root@zcy-1 shell]# 
  • 獲取陣列的元素個數
[root@zcy-1 shell]# b=(1 2 3)
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${#b[@]}
3
[root@zcy-1 shell]# b=(1 2 3 4 5)
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${#b[@]}
5
[root@zcy-1 shell]# 
  • echo ${b[*]} 等同於 ${b[@]}顯示整個陣列
[root@zcy-1 shell]# b=(1 2 3 4 5)
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${#b[@]}
5
[root@zcy-1 shell]# echo ${#b[*]}
5
[root@zcy-1 shell]# 

陣列賦值

針對其中一個元素進行賦值

[root@zcy-1 shell]# b[4]=10
[root@zcy-1 shell]# echo ${b[@]}
1 2 3 4 10
[root@zcy-1 shell]# b[5]=adc
[root@zcy-1 shell]# echo ${b[@]}
1 2 3 4 10 adc
[root@zcy-1 shell]# 

如果下標不存在則會自動新增一個元素

  • 數元素的刪除
[root@zcy-1 shell]# echo ${b[@]}
1 2 3 4 10 adc
[root@zcy-1 shell]# 
[root@zcy-1 shell]# unset b[2]  //刪除第3個元素,預設從0開始的
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${b[@]}
1 2 4 10 adc
[root@zcy-1 shell]# 

清空陣列的值

[root@zcy-1 shell]# echo ${b[@]}
1 2 4 10 adc
[root@zcy-1 shell]# 
[root@zcy-1 shell]# unset b 
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${b[@]}

[root@zcy-1 shell]# 

陣列的分片

在一些特殊需求下還是很有可能用到的

陣列賦值的另一個方式

[root@zcy-1 shell]# a=(`seq 1 10`)
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${a[@]}
1 2 3 4 5 6 7 8 9 10
[root@zcy-1 shell]# 

陣列分片

[root@zcy-1 shell]# echo ${a[@]}
1 2 3 4 5 6 7 8 9 10
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${a[@]:0:3}  //從第一個元素開始,擷取3個
1 2 3  
[root@zcy-1 shell]# echo ${a[@]:2:5}  //從第三個元素開始,擷取5個
3 4 5 6 7
[root@zcy-1 shell]# echo ${a[@]}
1 2 3 4 5 6 7 8 9 10
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${a[@]:0-4:3}  //從倒數第4個元素開始,擷取3個
7 8 9
[root@zcy-1 shell]# 

陣列的替換

echo ${a[@]/4/20} //其中4是被替換的值,100是替換後的值
[root@zcy-1 shell]# echo ${a[@]/4/20}
1 2 3 20 5 6 7 8 9 10
[root@zcy-1 shell]# 

還可以直接賦值,需要注意加上()

[root@zcy-1 shell]# echo ${a[@]}
1 2 3 4 5 6 7 8 9 10
[root@zcy-1 shell]# 
[root@zcy-1 shell]# a=(${a[@]/4/11})
[root@zcy-1 shell]# 
[root@zcy-1 shell]# echo ${a[@]}
1 2 3 11 5 6 7 8 9 10
[root@zcy-1 shell]#