Linux使用shell數組

3.使用Shell數組
問題
本案例要求編寫一個Shell腳本getips.sh,相關要求如下:
能夠反覆從鍵盤輸入IP地址,保存到數組
當用戶輸入“EOF”後結束輸入,顯示數組IPADDS各元素的值
最後報告本次錄入的IP地址個數、其中第1個錄入的地址
方案
建立數組的方法:
格式1,整體賦值:數組名=(值1 值2 … … 值n)
格式2,單個元素賦值:數組名[下標]=值
查看數組元素的方法:
獲取單個數組元素:[]{數組名[下標]} 獲取所有數組元素:{數組名[@]}
獲取數組元素個數:KaTeX parse error: Expected '}', got '#' at position 2: {#̲數組名[@]} 獲取連續的多個…{數組名[@]:起始下標:元素個數}
獲取某個數組元素的長度:KaTeX parse error: Expected '}', got '#' at position 2: {#̲數組名[下標]} 截取數組元素…{#數組名[下標]:起始下標:字符數}
步驟
實現此案例需要按照如下步驟進行。
步驟一:認識數組的賦值/引用基本方法
1)declare命令的使用
在Shell環境中,變量默認均作爲字符串處理,當參與expr、[]使1+2X+2[]數學運算時自動作爲整數處理。比如,使用“1+2”、“X+2”、“X+2”表達式是無法將運算結果直接作爲整數賦值給指定的變量的:
[root@svr5 ~]# X=24
[root@svr5 ~]# A=1+2
[root@svr5 ~]# echo $A
1+2 //賦值結果爲字符串
[root@svr5 ~]# A=X+2
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 40: …串 [root@svr5 ~]#̲ A=X+2
[root@svr5 ~]# echo $A
24+2 //賦值結果爲字符串
上述操作中,變量A均作爲字符串處理。
若要將一個變量強制設置爲整數,可以使用declare命令聲明(-i選項):
[root@svr5 ~]# declare -i A //先將A聲明爲整數變量
[root@svr5 ~]# A=1+2 //然後賦值
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 30: …3 [root@svr5 ~]#̲ declare -i B=X+2 //也可以在聲明的同時進行賦值
[root@svr5 ~]# echo $B
26
declare命令結合-x選項,可以將局部變量設置爲全局變量,這個與export命令的作用差不多:
[root@svr5 ~]# declare -x NM=“Tarena” //新建全局變量NM
[root@svr5 ~]# bash //進入子Shell環境
[root@svr5 ~]# echo $NM //驗證全局變量
Tarena
[root@svr5 ~]# exit //返回到原Shell環境
exit
[root@svr5 ~]#
如果要取消變量的全局屬性,可以使用“+x”選項:
[root@svr5 ~]# declare +x NM //將NM恢復爲局部變量
[root@svr5 ~]# bash //進入子Shell環境
[root@svr5 ~]# echo $NM //檢查已無法調用NM變量

[root@svr5 ~]# exit //返回到原Shell環境
exit
[root@svr5 ~]#
declare命令結合-r選項,可以爲變量設置“只讀”屬性,只讀變量的值不允許再被修改,通常可用來保存一些固定的參數,避免無意中被修改:
[root@svr5 ~]# echo $NM
Tarena
[root@svr5 ~]# declare -r NM //將變量NM設置爲只讀
[root@svr5 ~]# NM=“Tarena IT Group.” //重新賦值失敗
-bash: NM: readonly variable
[root@svr5 ~]# echo $NM //查看還是原來的值
Tarena
只讀變量除了不能修改值以外,也無法被unset清除(若要清除只讀變量,需要退出當前Shell程序):
[root@svr5 ~]# unset NM
-bash: unset: NM: cannot unset: readonly variable
[root@svr5 ~]# echo $NM
Tarena
2)定義/賦值數組
使用declare命令,結合-a選項可聲明一個數組(這個操作一般可不做),比如:
[root@svr5 ~]# declare -a SVRS
直接執行declare -a,即不指定數組名參數時,會列出當前Shell環境中已定義的所有數組設置:
[root@svr5 ~]# declare -a //查看已定義的數組
declare -a BASH_ARGC=’()’
declare -a BASH_ARGV=’()’
declare -a BASH_LINENO=’()’
declare -a BASH_SOURCE=’()’
declare -ar BASH_VERSINFO=’([0]=“3” [1]=“2” [2]=“25” [3]=“1” [4]=“release” [5]=“x86_64-redhat-linux-gnu”)’
declare -a DIRSTACK=’()’
declare -a FQDNS=’([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com”)’
declare -a FUNCNAME=’()’
declare -a GROUPS=’()’
declare -a PIPESTATUS=’([0]=“0” [1]=“0”)’
declare -a SVRS=’([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)’
若要定義數組的成員,可以在declare聲明時定義,也可以直接整體定義。整體賦值的格式爲“數組名=(值1 值2 值3 … …)”,比如:
[root@svr5 ~]# MY_SVRS=(www ftp mail club)
[root@svr5 ~]# set | grep “MY_” //查看數組定義結果
MY_SVRS=([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)
Shell中的語法要求是比較鬆散的,所以我們也可以直接爲單個數組元素賦值,格式爲“數組名[下標]=值”,每個數組元素的編號(即下標)從0開始。比如,以下操作會產生一個包括3個元素的數組:
[root@svr5 ~]# WEB_SVRS[0]=“www.tarena.com” //爲第1個元素賦值
[root@svr5 ~]# WEB_SVRS[1]=“mail.tarena.com” //爲第2個元素賦值
[root@svr5 ~]# WEB_SVRS[2]=“club.tarena.com” //爲第3個元素賦值
[root@svr5 ~]# set | grep “WEB_” //查看數組定義
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com
[2]=“club.tarena.com”)
爲數組元素賦值時,並不要求每個成員都需要指定,下標也可以不連續。比如,可跳過下標3,直接爲下標爲4的元素賦值:
[root@svr5 ~]# WEB_SVRS[4]=“tts6.tarena.com
[root@svr5 ~]# set | grep “WEB_” //確認設置結果
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com” [4]=“tts6.tarena.com”)
3)查看數組、查看數組元素
輸出整個數組的內容:
[root@svr5 ~]# echo ${MY_SVRS[@]}
www ftp mail club
查看第1個(下標爲0的)數組元素:
[root@svr5 ~]# echo ${MY_SVRS[0]}
www
或者
[root@svr5 ~]# echo ${MY_SVRS} //省略下標時,默認視爲0
www
輸出下標爲2的數組元素:
[root@svr5 ~]# echo ${MY_SVRS[2]}
mail
輸出數組中下標從1開始的2個元素:
[root@svr5 ~]# echo ${MY_SVRS[@]:1:2}
ftp mail
查看數組的元素個數:
[root@svr5 ~]# echo ${#MY_SVRS[@]}
4
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲WEB_SVRS[@]} 4 …IP" != “EOF” ]
do
IPADDS[i]="i]="IP" //每次錄入賦值給不同的數組元素
let i++
done
echo “您已錄入的IP地址如下:”
echo ${IPADDS[@]} //輸出整個數組
echo “總共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 個地址,…{IPADDS[0]}” //輸出第1個元素
[root@svr5 ~]# chmod +x getips.sh
3)驗證、測試腳本
[root@svr5 ~]# ./getips.sh
請添加IP地址(輸EOF結束):192.168.4.77
請添加IP地址(輸EOF結束):172.16.16.220
請添加IP地址(輸EOF結束):218.56.57.58
請添加IP地址(輸EOF結束):192.168.1.5
請添加IP地址(輸EOF結束):192.168.1.202
請添加IP地址(輸EOF結束):220.106.0.20
請添加IP地址(輸EOF結束):EOF
您已錄入的IP地址如下:
192.168.4.77 172.16.16.220 218.56.57.58 192.168.1.5 192.168.1.202 220.106.0.20
總共包括 6 個地址,
其中第1個IP地址是:192.168.4.77
4)遍歷數組元素時分行顯示
當數組元素的內容較多時,直接輸出 KaTeX parse error: Expected 'EOF', got '#' at position 131: …: [root@svr5 ~]#̲ vim getips.sh …IP" != “EOF” ]
do
IPADDS[i]="i]="IP"
let i++
done
echo “您已錄入的IP地址如下:”
#echo ${IPADDS[@]}
i=0 //控制下標增長的變量
while [ $i -lt ${#IPADDS[@]} ] //條件爲下標小於元素個數
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {IPADDS[@]:i:4} //輸出連續的四個元素
let i+=4 //下標自增4
done
echo “總共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 個地址,…{IPADDS[0]}”
驗證腳本執行效果:
[root@svr5 ~]# ./getips.sh
請添加IP地址(輸EOF結束):192.168.4.77
請添加IP地址(輸EOF結束):172.16.16.220
請添加IP地址(輸EOF結束):192.168.1.5
請添加IP地址(輸EOF結束):192.168.1.202
請添加IP地址(輸EOF結束):10.0.0.17
請添加IP地址(輸EOF結束):10.0.0.27
請添加IP地址(輸EOF結束):220.106.0.20
請添加IP地址(輸EOF結束):202.110.79.81
請添加IP地址(輸EOF結束):61.133.84.128
請添加IP地址(輸EOF結束):61.133.84.72
請添加IP地址(輸EOF結束):EOF
您已錄入的IP地址如下:
192.168.4.77 172.16.16.220 192.168.1.5 192.168.1.202
10.0.0.17 10.0.0.27 220.106.0.20 202.110.79.81
61.133.84.128 61.133.84.72
總共包括 10 個地址,
其中第1個IP地址是:192.168.4.77

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章