数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值
关联数组跟普通数组的区别:
普通数组:通过索引来确定值;
关联数组:标签和值互相关联,通过调用标签来获取标签对应的值。
引用数组:${array_name[index]}
只能用整数作为数组的索引(用索引作为数组的标识,即:下标[0]/[1])
[root@localhost ~]# books=( linux shell awk sed ) //在python中叫列表
[root@localhost ~]# echo ${books[0]}
linux
[root@localhost ~]# echo ${books[1]}
shell
[root@localhost ~]# echo ${books[2]}
awk
可以使用字符串作为数组的索引
关联数组需要提前声明,通过declare命令来声明
Declare命令:declare [-选项]
参数说明:
-a :定义为数组–array(普通数组)
-A:定义关联数组
[root@localhost ~]# declare -A myarry1 //先声明数组为关联数组
[root@localhost ~]# myarry1=([name]=tom [sex]=man [age]=18) //通过标签来确定值,而不是通过索引号来确定值
[root@localhost ~]# echo ${myarry1[name]} //调用时,通过调用数组[标签名]的方式来调用
tom
[root@localhost ~]# echo ${myarry1[age]}
18
如果事先没有声明,会发生什么呢?
[root@localhost ~]# liangzai=([name]=liangzai [age]=18 [sex]=male)
[root@localhost ~]# echo ${liangzai[name]}
male
[root@localhost ~]# echo ${liangzai[age]}
male
//每次调用的都是最后一个标签的值
设置完数组再声明可以么?
[root@localhost ~]# declare -A liangzai
-bash: declare: liangzai: 无法将索引数组转化为关联数组
得出结论:在使用关联数组前一定要先声明该数组为关联数组
定义方法1:
[root@localhost ~]# declare -a myarry=(5 6 7 8)
[root@localhost ~]# echo ${myarry[2]}
显示结果为 7
定义方法2:
[root@localhost ~]# array1=( one two three four five six )
[root@localhost ~]# array2=(tom jack alice)
[root@localhost ~]# array3=(`cat /etc/passwd`) //希望是将文件中的每一行作为一个值赋给数组array3
[root@localhost ~]# array3=($(cat /etc/passwd)) //或者这样写也可以
//执行结果
[root@localhost ~]# echo ${array3[0]}
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${array3[1]}
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# array4=(tom jack alice "bash shell")
[root@localhost ~]# array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
//执行结果:
[root@localhost ~]# echo ${array5[7]}
linux shell
[root@localhost ~]# echo ${array5[8]} //打印第8个索引为空
[root@localhost ~]# echo ${array5[20]}
saltstack
#如果指定索引号和现有的冲突,指定索引号的内容会覆盖原索引内容
定义方法3:自定义索引号
//语法:数组名[index]=变量值
[root@localhost ~]# vim array6.sh
#!/bin/bash
area[11]=23
area[13]=37
area[51]="UFO"
//示例
[root@localhost ~]# vim shuzu.sh
#!/bin/bash
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
NAME[5]="ZZ"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "sixth Index: ${NAME[5]}"
//输出结果
[root@localhost ~]# bash shuzu.sh
First Index: BJ
Second Index: SH
sixth Index: ZZ
[root@localhost ~]# vim a.sh //这里@和*作用一样
#!/bin/bash
aa=(哈哈哈 嘿嘿嘿 略略略 886)
echo "数组中第一个元素为:"${aa[0]} //访问数组中的第一个元素
echo "数组中所有的元素为:"${aa[@]} //访问数组中所有的元素 等同与echo ${aa[*]}
echo "数组中元素的个数为:"${#aa[@]} //统计元素的个数
echo "数组中每个索引为:"${!aa[@]} //打印索引
[root@localhost ~]# bash a.sh
数组中第一个元素为:哈哈哈
数组中所有的元素为:哈哈哈 嘿嘿嘿 略略略 886
数组中元素的个数为:4
数组中每个索引为:0 1 2 3
常见的应用场景
//批量创建用户,在公司中按照部门来创建账号
op=(liangzai1 liangzai2)
front=(laowang laowu)
backend=(laolu laochen)
test=(laozhang laoluo)
?
//通过访问数组的方式批量创建用户
user=(liangzai1 liangzai2 liangmei1 liangmei2)
for i in "${user[@]}"
do
id $i &>/dev/null || useradd $i
echo "$i用户创建成功"
done
?
[root@localhost ~]# id liangzai1
uid=1001(liangzai1) gid=1001(liangzai1) 组=1001(liangzai1)
?
?//删除用户
#!/bin/bash
user=(liangzai1 liangzai2 liangmei1 liangmei2)
for i in "${user[@]}"
do
#id $i &>/dev/null || useradd $i
#批量删除用户
id $i &>/dev/null && userdel -r $i
#echo "$i用户创建成功"
echo "$i用户删除成功"
done
您可以访问数组中的所有项目通过以下方式之一:
${array_name[*]}
${array_name[@]}
关于在shell脚本中数组变量中“星号 * " 跟”@“区别
“星号 * " 当变量加上双引号后,会当成一串字符串处理(会当成一个整体)
”@”当变量加上双引号后,依然当做数组处理(会挨个处理)
在没有加上双引号""的情况下效果是等效的
[root@localhost ~]# vim shuzu1.sh
#!/bin/sh
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
echo "${NAME[*]}"
echo "${NAME[@]}"
[root@localhost ~]# bash shuzu1.sh
BJ SH SZ GZ HZ
BJ SH SZ GZ HZ
//示例
[root@localhost ~]# vim test1.sh
#!/usr/bin/env bash
array=(gz cloud 19)
echo "case 1"
for line in "${array[@]}"
do
echo $line
done
echo ""
?
echo "case 2"
for line in "${array[*]}"
do
echo $line
done
echo ""
?
echo "case 3"
for line in ${array[*]}
do
echo $line
done
echo ""
?
echo "case 4"
for line in ${array[@]}
do
echo $line
done
echo ""
//执行结果
[root@localhost ~]# bash test1.sh
case 1
gz
cloud
19
?
case 2
gz cloud 19
?
case 3
gz
cloud
19
?
case 4
gz
cloud
19