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[@]}的前面的\也要加上,否则就会报错。就是语法,我暂时也没有完全搞明白,后面搞明白了,再来更新。