shell中数组的使用
1 数组的定义
1.1 普通数组
- 常规定义
num=(1 2 3)
num[3]=4;num[4]=5
或者
str1=('a' 'b' 'c')/str1=(a b c)
str2[0]=a
str2[1]='b'
str2[5]=d
str2[3]=c
备注:在使用形如str[0]=1定义数组是,数组的下标值可以不是连续的正整数,元素的顺序按照下标的升序排列,数组的长度由实际包含的元素个数决定,不受下标值的影响。echo ${str2[0]};echo ${str2[5]的值为a d,echo ${str[2]}的值为空。
2. 特殊定义
1. 在for循环中,也可以直接声明并使用数组
for num in 1 2 3 4 5 do echo "num is: ${num}" done
2. 使用自定义的分隔符分割
str="a,b,c" OLD_IFS="$IFS" IFS="," arr=($str) IFS="$OLD_IFS"`
此时arr数组的值为a b c
或者是:str="m,n";IFS=",";arr=($str),也能按照","对字符串进行分割。与上一条的区别是,上一条更改了IFS的默认值,之后又改了回去,但是第3条没有改回去。IFS的默认值为空格、teb或换行。详细的分析见:参考文章
1.2 关联数组
bash从4.0版本支持关联数组的使用,使用方式类似高级语言的Map数组。
1. 声明关联数组
`declare -A user`
2. 定义数组
```
user[name]='jack'
user[age]=18
```
或者`user=([name]='jack' [age]=18)`
此时`echo ${user[name]};echo ${user[age]}`的结果是`jack 18`。
3. 备注
1. 如果不声明数组为关联数组,`user["name]="jack;user["sex"]="M"`,结果数组的长度为1,`user["name"]`的值会被`user["sex"]`的值覆盖。`echo $user["name"];echo $user["sex"]`的值为`M M`.
2. 数字下标也支持字符型的。`num["1"]="111"`与`num[1]="111"`是等效的,并且字符型数字做下标不会有上一条的现象,`num["1"]=1;num["2"]=2;num["3"]=3`,数组num的长度为3。
2. 数组的遍历
2.1 for循环
- 高级语言的形式
for((i=0;i<${#num[@]};i++))
do
echo "num is: ${num[i]}"
done
- foreach形式
for nu in ${num[*]}
do
echo "num is: $nu"
done
其中,${num[*]与${num[@]效果相同
2.2 while
i=0
while [ $i -lt ${#num[@]} ]
do
echo "num is: ${num[$i]}"
echo "i is: $i"
i=`expr $i + 1`
done
备注:i的自增还可以使用i=$[$i+1]、let "i+=1"和i=$(($i+1))。具体的shell运算规则请参考xxx.
2.3 until
i=0
until [ $i -ge ${#num[*]} ]
do
echo "num is: ${num[$i]}"
i=`expr $i + 1`
done
2.4 对关联数组的遍历
- for循环遍历
for u in ${!user[@]}
do
echo "user's ${u} is : ${user[$u]}
done
结果是:
user's name is : jack
user's age is : 18
备注:${!user[@]}获取的是关联数组的所有下标值组成的数组
3. 数组增加元素
- 添加单个元素
- 添加元素到数组头
此时num的值为num=(3 ${num[@]})3 1 2 3 4 5
2. 添加元素到数组尾
此时num的值为num=(${num[@]} 6)3 1 2 3 4 5 6
或者使用下标添加:num[${#num[@]}]=7,此时num的值为3 1 2 3 4 5 6 7。 - 添加其他数组到数组
类似于添加单个元素- 添加其他数组到数组头
abc=(11 22 33);num=(${abc[@]} ${num[@]}) - 添加其他数组到数组尾
num=(${num[@]} ${abc[@]})
- 添加其他数组到数组头
4. 数组更新元素值
- 使用下标值更新数组
num[0]=22222或者num[0]=${abc[2]} - 用一个数组更新单个值
num[1]=${abc[@]}
此时num中的一个值被abc数组替换,相当于删除下标为1的值,并从下标1开始添加若干个元素。
5. 数组删除元素值
unset num[1]或者unset user[name]
6. 删除数组
unset num

浙公网安备 33010602011771号