一、数组基础

Shell的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量
数组也是一种变量变量,所以变量子串的相关功能数组也同样适用,数组下标默认是从0开始计数的。

数组的相关知识通过man bash然后搜Arrays来了解。

1. 定义数组

1) 静态命名数组

  • 方法1[推荐]
    array1=(1 2 3)
  • 方法2
1
2
3
4
array2=(
www.baidu.com
www.sina.com
)
  • 方法3
    array=([0]=one [1]=two [2]=three [3]=four)

2) 动态命令创建数组

1
2
array=($(ls))
array=(`ls`)

2. 打印数组

1) 打印所有元素:

1
2
$(array[@])
$(array[*])

2) 打印数组长度:

1
2
$(#array[@])
$(#array[*])

3) 打印单个元素:

$(array[i])

3. 增改数组数据

1) 增改

1
2
3
array[0]=one
array[1]=two
array[2]=three

如果对应的下标值不存在,则新赋值,如果已存在,则会覆盖原值

4. 删除数组数据

因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清除整个数组的所有数据。

1
2
unset array[1]
unset array

5. 切片和替换[变量子串]

数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。

1) 切片功能

1
2
array=(1 2 3 4 5)
echo ${array[@]:1:3}

2 3 4
从下标为1的元素开始截取,共取3个数组元素。其他用法参考变量子串的用法

2) 替换

1
2
array=(1 2 3 1 1)   
echo ${array[@]/1/b}

b 2 3 b b
把数组中的1替换成b,原数组未被修改,和sed很像。其他用法参考变量子串的用法
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组

二、案例

1. 内容打印数组元素个数

  • array=(1 2 3 4 4) && echo ${array[@]}
    1 2 3 4 4
  • echo ${ #array[@]}
    5
  • echo ${array[1]}
    2

数组下标默认是从0开始计数的

2. for循环打印数组

用数组和for循环将“i am oldboy my teacher is luogang”这句话中,字符数小于等于6个的单词打印出来

  • cat /server/scripts/d1.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
array=(i am oldboy my teacher is luogang)
for n in ${array[*]}
do
if [ `echo $n|wc -L` -le 6 ]
then
echo $n
fi
done
echo -----------------
for((i=0;i<${#array[*]};i++))
do
if [ ${#array[i]} -le 6 ]
then
echo ${array[i]}
fi
done
  • sh /server/scripts/d1.sh