shell编程之数组

1.数组定义方法

Shell数组:Shell数组定义以及获取数组元素
和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组

Shell 数组的定义
Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:

array_name=(ele1 ele2 ele3 … elen)
注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素

(1)

[root@base1 mnt]# array=(1 2 3)   # 定义数组
[root@base1 mnt]# echo ${array[*]}  # 输出数组中的所有
1 2 3 

(2)

[root@base1 mnt]# array=([1]=one [2]=two [3]=three) # 自己定义数组元素的下标
root@base1 mnt]# echo ${array[*]}
one two three

(3)

[root@base1 mnt]# array[0]=a
[root@base1 mnt]# array[1]=b
[root@base1 mnt]# array[2]=c
[root@base1 mnt]# array[3]=d
[root@base1 mnt]# echo ${array[0]}
a
[root@base1 mnt]# echo ${array[2]}
c
[root@base1 mnt]# echo ${array[*]}
a b c d

(4)动态定义数组变量并使用命令的输出结果作为数组的内容

[root@base1 mnt]# mkdir /array -p
[root@base1 mnt]# touch /array/{1..3}.txt
[root@base1 mnt]# ls /array/
1.txt  2.txt  3.txt
[root@base1 mnt]# array=($(ls /array))  # 把ls /array的输出结果作为数组的值
[root@base1 mnt]# echo ${array[*]}  # 打印数组
1.txt  2.txt  3.txt

2.数组的打印和输出

(1)打印数组元素

[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# echo ${array[0]}  # 默认第一个元素的下标是0
one
[root@base1 mnt]# echo ${array[1]}
two
[root@base1 mnt]# echo ${array[@]}  # 打印数组全部元素,@和*是一样的效果
one two three

(2)打印元素个数

[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# echo ${#array[@]}
3
[root@base1 mnt]# echo ${#array[*]}
3

(3)数组的赋值

如果下标不存在,则自动添加一个新元素,如果存在,则覆盖原来的值

[root@base1 mnt]# array=(one two three)
[root@base1 mnt]# array[3]=four
[root@base1 mnt]# echo ${array[*]}
one two three four
[root@base1 mnt]# array[0]=hello  # 重新定义下标为0的数组元素
[root@base1 mnt]# echo ${array[*]}  # 查看定义成功
hello two three four
[root@base1 mnt]# echo ${array[@]:1:3}  # 打印下标为1开始的3个数组元素
two three four
[root@base1 mnt]# array=(1 2 3 1 3)
[root@base1 mnt]# echo ${array[*]}
1 2 3 1 3
[root@base1 mnt]# echo ${array[*]/1/a}  # 把数组中所有的1替换成为a
a 2 3 a 3
[root@base1 mnt]# array=(1 2 3 1 3)
[root@base1 mnt]# unset array[1]   # 删除下标为1的数组元素
[root@base1 mnt]# echo ${array[*]}
1 3 1 3
[root@base1 mnt]# unset array   # 删除所有的数组元素
[root@base1 mnt]# echo ${array[*]}

练习1:用循环输出数组中元素的下标

[root@base1 mnt]# vim shuzu_xiabiao.sh
  #!/bin/bash 
 array=(7 3 4 6 2) 
  for ((i=0;i<${#array[*]};i++)) 
  do 
      echo $i 
  done

练习2:用for循环打印下面这句话中字母个数不大于6的单词
I am westos teacher welcome to westos training class

[root@base1 mnt]# vim shuzu_bianli.sh 
 #!/bin/bash 
 array=(I am westos tescher welcome to westos training class) # 定义数组元素 
 for ((i=0;i<${#array[@]};i++))  # 循环遍历数组元素 
 do 
     if [ ${#array[$i]} -lt 6 ];then  # 在数组元素中继续遍历,统计数组中每个元素的个数 
         echo ${array[$i]} 
     fi   
 done

练习3 通过竖向列举法定义数组元素并批量打印

[root@ci-node1 scripts]# cat 16.sh 
#!/bin/bash
arrary=(
    oldboy
    oldgirl
    xiaoting
    binggin
)
for ((i=0;i<${#arrary[*]};i++))
do
    echo "This is num $i,then content is ${arrary[i]}"
done

练习4 把命令结果作为数组元素定义并打印

[root@ci-node1 scripts]# cat 17.sh 
#!/bin/bash
arrary=(`ls /oldboy`)
for ((i=0;i<${#arrary[*]};i++))
do
    echo "This is num $i,then content is ${arrary[i]}"
done
echo  --------------------
arrary1=($(ls /oldboy))
num=0
for i in ${arrary1[*]}
do
    echo "This is num $num,then content is $i"
    ((num++))
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值