【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

猜你喜欢

转载自www.cnblogs.com/OliverQin/p/10256648.html
今日推荐