Shell Script 数组总结

1. 从定义数组开始

方法①-without index

# format
array=(value0 value1 value2 ···)
# format example
# right √ : array=(x x x)
$ array=(aa 123 bb cc dd)

# wrong × : array = (x x x)
$ array = (aa 123 bb cc dd)
bash: syntax error near unexpected tokken `('

# Example
$ array=(aa 123 bb cc dd)
# ${array[*]} will return all elements of this array
$ echo ${array[*]}
aa 123 bb cc dd
# ${array[@]} will return the same as "*"
$ echo ${array[@]}
aa 123 bb cc dd

方法②-通过索引定义数组

# format
array=([0]=value [1]=value [2]=value ···)

# example
$ echo ${array[@]}
100 200 300

# 删除此数组变量
unset array

# format,除了字符类型外,同样适用与数值类型
array[0]="11"
array[2]="22"
array[4]="55"

# example
$ echo ${array[*]}
11 22 55

# 获取数组的所有下标是取反,可以观察数组的连续情况
$ echo ${!array[*]}
0 2 4

方法③-字符串数组(以空格分割)

# format
array="value0 value1 value2 ···"

# example
array="01 02 03 04"
$ echo ${array[*]}
01 02 03 04

小结

  • shell中的数组数据类型分为数值和字符串,分别通过a=(), a=" "(or a=‘’)两种方式来定义
  • 可以通过指定索引的方式精准定义数组内元素,此方式可集中进行、可分散进行。可通过${!array[@]}来查看数组的索引,从而观察索引是否连续
  • $ {array[@]}、${array[*]} 返回数组内所有元素

2. 具体实例介绍用法

#!/bin/bash
echo "requir-1: 定义数值数组,元素从1~10。"
   arr=(1 2 3 4 5 6 7 8 9 10) # done-1
# index:0 1 2 3 4 5 6 7 8 9

echo "requir-2: 通过数组切片,打印整个数组。"
echo ${arr[@]} # , ${arr[*]} 同样可行。相当于切片:${arr[@]:0:9}

echo "requir-3: 遍历打印数组"
for i in ${arr[*]} 
do 
	echo $i
done

echo "requir-4: 打印数组索引,观察是否连续"
echo ${!arr[@]}

echo "requir-5: 通过数组切片,从索引6开始,取2位。"
echo ${arr[@]:6:2} # 从索引为6起,切2个元素

echo "requir-6: 打印指定索引为8的元素"
echo ${arr[8]}

echo "requir-7: 通过数组切片,从索引8开始,取1位。"
echo "${arr[@]:8:1}" # 从索引为8起,切1个元素

echo "requir-8:将索引为0的元素数值替换为111"
arr[0]=111
echo ${arr[@]}

echo "requir-9: 定义数组array_test:10,20,30,40,50。"
arr_test=(10 20 30 40 50)
echo "arr_test= ${arr_test[@]}"

echo "requir-10: 打印时,将这个数组所有数值里的“0”替换为“9”"
echo "arr_test= ${arr_test[@]}"
echo ${arr_test[@]/0/9}

echo "requir-11: 永久的,将这个数组所有数值里的“0”替换为“9”"
echo "arr_test= ${arr_test[@]}"
arr_test1=${arr_test[*]/0/9}
arr_test=($arr_test1)  # 注意!!!此处是 ($arr)
echo ${arr_test[@]}

echo "requir-12: 先删除索引为0的元素,然后删除数组array_test"
unset arr_test[0]
echo ${arr_test[@]}
unset arr_test
echo "arr_test is ${arr_test[@]}  ..."

echo "requir-13: 给数组arr增加一个元素,数值=99,索引=10"
arr[10]=99
echo ${!arr[@]}
echo ${arr[@]}

echo "requir-14: 根据数组长度,使用索引给数组直接添加元素:88"
arr[${#arr[*]}]=88
echo ${!arr[@]}
echo ${arr[@]}

echo "requir-15: 使用重新定义的方式,连续增加三个元素:(12,12), (13,13), (14,14),左索引右数值。"
arr=("${arr[@]}" 12 13 14)
echo ${!arr[@]}
echo ${arr[@]}

echo "requir-16: 在数组的尾巴处,直接添加1个元素:15"
arr+=(15)
echo ${!arr[@]}
echo ${arr[@]}

echo "requir-17: 在数组的尾巴处,直接添加2个元素:16,17"
arr+=(16 17)
echo ${!arr[@]}
echo ${arr[@]}

$ bash test.sh 
requir-1: 定义数值数组,元素从1~10。
requir-2: 通过数组切片,打印整个数组。
1 2 3 4 5 6 7 8 9 10
requir-3: 遍历打印数组
1
2
3
4
5
6
7
8
9
10
requir-4: 打印数组索引,观察是否连续
0 1 2 3 4 5 6 7 8 9
requir-5: 通过数组切片,从索引6开始,取2位。
7 8
requir-6: 打印指定索引为8的元素
9
requir-7: 通过数组切片,从索引8开始,取1位。
9
requir-8:将索引为0的元素数值替换为111
111 2 3 4 5 6 7 8 9 10
requir-9: 定义数组array_test:10,20,30,40,50。
arr_test= 10 20 30 40 50
requir-10: 打印时,将这个数组所有数值里的“0”替换为“9”
arr_test= 10 20 30 40 50
19 29 39 49 59
requir-11: 永久的,将这个数组所有数值里的“0”替换为“9”
arr_test= 10 20 30 40 50
19 29 39 49 59
requir-12: 先删除索引为0的元素,然后删除数组array_test
29 39 49 59
arr_test is   ...
requir-13: 给数组arr增加一个元素,数值=99,索引=10
0 1 2 3 4 5 6 7 8 9 10
111 2 3 4 5 6 7 8 9 10 99
requir-14: 根据数组长度,使用索引给数组直接添加元素:88
0 1 2 3 4 5 6 7 8 9 10 11
111 2 3 4 5 6 7 8 9 10 99 88
requir-15: 使用重新定义的方式,连续增加三个元素:(12,12), (13,13), (14,14),左索引右数值。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14
requir-16: 在数组的尾巴处,直接添加1个元素:15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14 14
requir-17: 在数组的尾巴处,直接添加2个元素:16,17
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
111 2 3 4 5 6 7 8 9 10 99 88 12 13 14 14 15 16

3. 向函数传递数组参数

test1 (){
   echo "函数接收到的参数列表为:$@"
   newarr=($@)
   echo "新数组的值为:${newarr[@]}"
   sum=0
   for i in ${newarr[@]}
   do
     sum=$[$sum + $i]
   done
   echo "数组所有元素的累加值为:$sum" 
}
arr=(10 20 30 40 50)
echo "原始数组的值为:${arr[@]}"
test1 ${arr[*]}     #   调用函数的时候直接跟追数组的所有返回值!

4. 数组排序算法

具体请查看 封玖FJ 的博客:Shell脚本之数组(数组排序算法)

参考文章:

封玖FJ 的博客:Shell脚本之数组(数组排序算法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值