1. 程式人生 > >shell的函數引用和數組

shell的函數引用和數組

local 地址 root flag 下標 sid name 就是 while

shell中的函數

函數就是吧一段代碼整理到一個小單元中,並給這個小單元其一個名稱,當用到這段代碼時直接調用這個名稱即可

函數中的特殊調用
linux中shell變量

$#,$@,$0,$1,$2的含義解釋:
變量說明:
$$
Shell本身的PID(ProcessID)
$!
Shell最後運行的後臺Process的PID
$?
最後運行的命令的結束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$#
添加到Shell的參數個數
$0

Shell本身的文件名

這裏需要註意$1-$n數值的意義
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。

?
特殊$表示的含義,示例:

#!/bin/bash
#
printf "The complete list is %s\n" "$$"
printf "The complete list is %s\n" "$!"
printf "The complete list is %s\n" "$?"
printf "The complete list is %s\n" "$*"
printf "The complete list is %s\n" "$@"
printf "The complete list is %s\n" "$#"
printf "The complete list is %s\n" "$0"
printf "The complete list is %s\n" "$1"
printf "The complete list is %s\n" "$2

結果:

[root@localhost ~]$ bash params.sh 123456 QQ
The complete list is 24249
The complete list is
The complete list is 0
The complete list is 123456 QQ
The complete list is 123456
The complete list is QQ
The complete list is 2
The complete list is params.sh
The complete list is 123456
The complete list is QQ

定義一個使用函數公式計算的數值結果
定義一個加法公式,引用函數將某兩個數字相加得和

[root@localhost src]# vim jia.sh 
#!/bin/bash
sum () {
 ? ? ?s=$[$1+$2]
 ? ? ?echo $s
}
sum 20 10
[root@localhost src]# sh -x jia.sh 
+ sum 20 10
+ s=30
+ echo 30
30

shell函數腳本輸出網卡ip
輸入的網卡名稱並輸出顯示該網卡的ip地址

[root@localhost src]# cat fun1.sh 
ip () {
 ?  ifconfig |grep -A1 "$1: " |awk ‘/inet/ {print $2}‘
 } ? ? 
read -p "Please input the eth name: " eth
ip $eth
[root@localhost src]# sh -x fun1.sh 
+ read -p ‘Please input the eth name: ‘ eth
Please input the eth name: ens33
+ ip ens33
+ grep -A1 ‘ens33: ‘
+ awk ‘/inet/ {print $2}‘
+ ifconfig
192.168.1.234

判斷輸入網口名稱並提取ip地址的while循環和if判斷邏輯

[root@localhost src]# cat fun1.sh 
#!/bin/bash
 ?
ip () {
 ?  ifconfig |grep -A1 "$1: " |awk ‘/inet/ {print $2}‘
 } ? ? 
while :;
do 
  read -p "Please input the eth name: " eth
 ?n=`ifconfig |grep $eth`
 ? ?if [ -z $eth ]
 ? ? then 
 ? ? ? echo "必須輸入一個網口名稱"
 ? ? ? ? elif [ -z "$n" ]
 ? ? ? ? ?then
 ? ? ? ? ? ? ? echo "s輸入正確的網口名稱"
 ? ? ? ? ? continue
 ? ? ? ? ? ? else
 ? ? ? ? ? break
 ? ? fi
done
ip_=`ip $eth`
if [ -z $ip_ ]
 ?then
 ? ?echo "$eth:這個網卡沒有配置ip"
 ?else
 ? ?echo "$ip_" 
fi

shell中的數組

數組是一個變量中引用的多個數值,數值不一定是數字也可以是字符
定義數組
數組=(數值或字符)

a=(1 2 3 4 5)

獲取數組所有的數值,@表示數組內所有的值

echo ${a[@]}

獲取數組元素的個數

echo ${#a[@]}

獲取數組的第三個元素,數組內數值是按照從0開始的順序計算的,0對應第一個字符,1對應第二個字符....以此類推

echo ${a[2]}

數組賦值或添加下標元素

a[5]=100

如果該下標不存在元素時則會添加這個指定的數值元素
刪除數組或取消某一個元素

uset a 

或取消一個下標是第一位、是第三位的數組元素 ? unset a[1]
數組分片

a=(`seq 1 10`) ? 
echo $a{[@]:2:4}

?截取四個字符,從第三個數值開始,0對應數組的數值1的位置,截取四個字符結束,例如結果如下

[root@localhost src]# echo ${a[@]:2:4}
3 4 5 6

截取倒數字符
echo ${a[@]:0-2:3} ?
0-2表示從一段數組中的哪個位置開始往後計算,3表示截取幾個數值。如下操作示例

[root@localhost src]# echo ${a[@]:0-2:4}
9 10
[root@localhost src]# echo ${a[@]:0-5:4}
6 7 8 9

數組替換

echo ${a[@]/3/100}
?a=(${a[@]/3/222})

如下,將數組中某個下標數值替換成其他數值

[root@localhost src]# echo ${a[@]/3/100}
1 2 100 4 5 6 7 8 9 10
[root@localhost src]# a=(${a[@]/3/222})
[root@localhost src]# echo ${a[@]}
1 2 222 4 5 6 7 8 9 10

shell的函數引用和數組