shell脚本中数组和字典的学习总结

  • Post author:
  • Post category:其他


shell中有数值 字符串 还有数组 字典这几种常用的数据类型。其中数据和字典均可以用for进行迭代的遍历。

一、数组

定义:

直接赋值式的定义:里面可以包含数值和字符串

[root@uc197 ~]# arr=(1 2 3 sd)   #
[root@uc197 ~]# echo ${arr[0]} #打印数组中每个元素
1
[root@uc197 ~]# echo ${#arr[@]}   #打印数组的长度
4
[root@uc197 ~]# echo ${arr[`expr ${#arr[@]} - 1`]} #使用数组的长度-1然后打印最后一个数组的值
sd
[root@uc197 ~]# echo ${#arr[`expr ${#arr[@]} - 1`]}#打印数组中最后一个值的长度
2

for 循环遍历数组中的值:

arr=(1 2 3 sd)
for i in ${arr[@]};do   #其中@可以是*
        echo $i
done

二、字典,这个东西,我以为只有Python有,百度了一下,纳尼,shell中居然也有,没错,它是和Python一样,就是在一个()中存放key=value,语法和Python有点不一样,思想还是一样的。

语法:

两种方式定义:先定义,后赋值

需要使用declare -A 去声明,表示后面的变量是一个字典类型

#!/bin/bash
declare -A dic
dic['name']=jack  #dir[name]=jack也是可以的
dic['age']=18
for i in ${!dic[@]};do
        echo "$i:${dic[$i]}"
done
echo ${!dic[@]}  #打印字典的所有key
echo ${dic[@]}   #打印字典的所有value
dic+=([sex]=男) #在字典中追加sex=男

第二种定义的方式:直接定义的时候就赋值

declare -A dic=([name]=jack [age]=18 [sex]=男)
for i in ${!dic[@]};do
        echo "$i:${dic[$i]}"
done
echo ${!dic[@]}  #打印字典的所有key
echo ${dic[@]}   #打印字典的所有value
dic+=([sex]=女) #在字典中修改sex=女
dic[Tel]=12345 #字典中添加tel12345

三、二维数组

这个东西我也不知道自己理解的对不对,感觉就是arr[i][j]这样的就叫做二维数组,因为用到了两个下标。

在shell中我是在编写shell脚本的时候,有一个需求是需要这样的数据结构,但是一开始不知道,就用的多个函数来实现,实际上,这些函数里的内容基本都一样,唯独不一样的是定义的字典,写的时候,还在想要是能够用Python就好了,一个函数,加上一个装饰器就搞定了。为啥shell这么复杂,果然,是我自己修炼台低,不知道有二维数组这个东西。用了这个之后瞬间代码简化了几十行。

目前我想到的最好的办法就是二维数组了,可能还有别的更好的办法。。。。哎,论菜鸟和技术大牛之间的差距,不说了,让我哭一会。。。。

介绍二维数组之前,还有一个知识点,也是刚学到的,字符串可以转换成一维数组

#!/bin/bash
str="name=jack age=18"  #定义一个字符串
arr=($str)  #将字符串转换成数组
echo ${#arr[@]} #打印数组的长度
for ((i=0;i<${#arr[@]};i++));do   #遍历数组的下标,并打印每一个元素的值
        echo ${arr[$i]}
done

运行结果:

2
name=jack
age=18

如果是str=aaa.这样也是可以转换的,只是数组的长度就是1

下面来介绍二维数组

#!/bin/bash
a=(d1 d2)
d1=(aa bb cc)
d2=(11 22 33)
echo -e "a=${#a[@]}\nb=${#d1[@]}\nc=${#d2[@]}"
for i in ${a[@]};do
        echo $i
        for j in $(eval echo \${$i[@]});do 
                echo $j
        done
done

运行结果:

[root@uc201 ~]# sh 1.sh
a=2
b=3
c=3
d1
aa
bb
cc
d2
11
22
33

上面的第一个for循环是遍历数组名d1和d2:该数组名放在了数组a中。遍历的方式就是数组的遍历方式

上面的第二个for循环是遍历数组d1和d2中内容,由于他们也是数组,所以遍历的方式也是一样,只是替换要注意下数组名用第一个循环的遍历值



i

e

v

a

l

i进行替换的时候,需要加上eval ,






i






































e


v


a


l








(eval echo ${


KaTeX parse error: Expected ‘EOF’, got ‘}’ at position 5: i[@]}̲),且

{$i[@]}的前面的\也要加上,否则就会报错。就是语法,我暂时也没有完全搞明白,后面搞明白了,再来更新。



版权声明:本文为weixin_43726471原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。