Shell编程--数组

发布时间:2024年01月12日

1.定义数组

数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值
关联数组跟普通数组的区别:
普通数组:通过索引来确定值;
关联数组:标签和值互相关联,通过调用标签来获取标签对应的值。
引用数组:${array_name[index]}

1.1.普通数组

只能用整数作为数组的索引(用索引作为数组的标识,即:下标[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

1.2.关联数组

可以使用字符串作为数组的索引
关联数组需要提前声明,通过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.3.数组常用定义方法

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

2.使用数组

[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数组中"*" 和 “@” 区别

关于在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
文章来源:https://blog.csdn.net/m0_62396418/article/details/135549170
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。