【Linux】shell陣列
一、概念
shell陣列就是一個元素集合,它把有限個元素用一個名字來命名,然後用編號對他們分割槽。這個名字稱為陣列名,用於區分不同內容的編號稱為陣列的下標。
二、shell陣列的定義與增刪改查
1.shell陣列的定義
方法1:元素之間使用空格分隔,用小括號將元素括起來
語法:array=(value value1 value3 ...)
例項:
Linux:/qinys/data # array=(1 2 3)
Linux:/qinys/data # echo ${array[*]}
1 2 3
方法2:用小括號括起來,採用鍵值對賦值
語法:array=([key1]=value1 [key2]=value2 ...)
例項:
Linux:/qinys/data # array=([3]='A' [9]='B' [6]='C')
Linux:/qinys/data # echo ${array[3]}
A
Linux:/qinys/data # echo ${array[6]}
C
Linux:/qinys/data # echo ${array[9]}
B
Linux:/qinys/data # echo ${array[*]}
A C B
方法3:通過定義陣列變數的方法來定義(此方法太複雜,不推薦使用)
例項:
Linux:/qinys/data # arr1[0]=a
Linux:/qinys/data # arr1[1]=b
Linux:/qinys/data # arr1[2]=c
Linux:/qinys/data # echo ${arr1[1]}
b
方法4:動態定義陣列,使用命令輸出結果作為陣列的內容
語法:array=($(命令))或者array=(`命令`)
例項:
Linux:/qinys/data # ll
total 8
-rw-r--r-- 1 root root 11 Jan 11 02:23 a.txt
-rw-r--r-- 1 root root 12 Jan 11 02:30 b.txt
Linux:/qinys/data # arr2=($(ls /qinys/data/))
Linux:/qinys/data # echo ${arr2[*]}
a.txt b.txt
2.shell陣列的列印及輸出
(1)列印所有陣列元素
使用*或者@可以列印所有的素組元素
Linux:/qinys/data # arr3=(2 3 4)
Linux:/qinys/data # echo ${arr3[*]}
2 3 4
Linux:/qinys/data # echo ${arr3[@]}
2 3 4
(2)列印指定陣列元素
Linux:/qinys/data # echo ${arr3[1]}
3
(3)列印陣列長度
Linux:/qinys/data # echo ${#arr3[*]}
3
Linux:/qinys/data # echo ${#arr3[@]}
3
3.陣列的新增
例項:
Linux:/qinys/data # arr3[4]=5
Linux:/qinys/data # echo ${arr3[@]}
2 3 4 5
“陣列名[下標]”對陣列進行引用賦值,如果存在,則覆蓋,不存在則新增
4.陣列的刪除
使用命令unset刪除
例項:
Linux:/qinys/data # unset arr3[1]
Linux:/qinys/data # echo ${arr3[@]}
2 4 5
預設情況下,陣列下標元素從0開始
刪除整個陣列
unset arr3
Linux:/qinys/data # array_tmp=(1 2 3 4 5 6)
Linux:/qinys/data # echo ${array_tmp[@]:1:3} #<--擷取1號到3號的元素
2 3 4
Linux:/qinys/data # array_tmp=($(echo {a..z})) #<--將元素賦值給陣列
Linux:/qinys/data # echo ${array_tmp[@]}
a b c d e f g h i j k l m n o p q r s t u v w x y z
Linux:/qinys/data # echo ${array_tmp[@]/a/1000} #<--將元素a替換為1000
1000 b c d e f g h i j k l m n o p q r s t u v w x y z
三、shell陣列指令碼案例
1.迴圈列印陣列元素
#!/bin/bash array=(1 2 3) for((i=0;i<${#array[@]};i++)) do echo ${array[i]} done
輸出結果:
2.通過普通for迴圈語句列印陣列元素
#!/bin/bash array=(1 2 3) for i in ${array[@]} do echo $i done
輸出結果:
3.通過while迴圈列印陣列
#!/bin/bash array=(1 2 3) i=0 while((i<${#array[@]})) do echo ${array[i]} ((i++)) done
輸出結果與上述相同
4.豎向定義陣列並批量列印
#!/bin/bash arr_ip=( 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5) #迴圈列印陣列 for((i=0;i<${#arr_ip[@]};i++)) do echo "The num is $i,the ip is ${arr_ip[i]}" done echo "---------------------" echo "ayy_ip length is :${#arr_ip[@]}"
輸出結果:
四、現實案例
需求:利用bash打印出下面這句話中大於等於5個字母的單詞
my favourite subject is English . and i like sports very much
方法一:
#!/bin/bash arr=(my favourite subject is English . and i like sports very much) for((i=0;i<${#arr[@]};i++)) do if [ ${#arr[i]} -gt 5 ] then echo "${arr[i]}" fi done echo '----------------------' for word in ${arr[*]} do if [ `expr length $word` -gt 5 ]; then echo $word fi done
輸出結果:
方法2:使用awk列印
Linux:/qinys/data # chr="my favourite subject is English . and i like sports very much"
Linux:/qinys/data # echo $chr|awk '{for(i=0;i<=NF;i++) if(length($i)>5) print $i}'
my favourite subject is English . and i like sports very much
favourite
subject
English
sports