1. 程式人生 > >【Linux】shell陣列

【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


5.陣列元素的擷取與替換

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

輸出結果:

image

2.通過普通for迴圈語句列印陣列元素

#!/bin/bash
array=(1 2 3)
for i in ${array[@]}
do
	echo $i
done

輸出結果:

image


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[@]}"

輸出結果:

image


四、現實案例

需求:利用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

輸出結果:

image

方法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