shell数组

数组概述

 1 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
 2 与大部分编程语言类似,数组元素的下标由0开始。
 3 Shell 数组用括号来表示,元素用”空格”符号分割开,语法格式如下:
 4 my_array=(value1 value2 … valueN)
 5 例如:my_array=(A B "C" D)
 6 我们也可以使用下标来定义数组:
 7 
 8 my_array[0]=value0
 9 my_array[1]=value1
10 my_array[2]=value2
数组概述:

数组中的主要方法

1 读取数组 :读取数组元素值的一般格式是:${array_name[index]}
2 获取数组中的所有元素:使用@ 或 * 可以获取数组中的所有元素,
3 获取数组的长度:获取数组长度的方法与获取字符串长度的方法相同
读取、获取元素、获取数组长度

shell 数组遍历的3种方法

  • 标准的for循环
  • for … in循环方法
  • While循环法

代码:

 1 #!/bin/bash
 2 cwd=$(cd $(dirname $0); pwd)
 3 function main()
 4 {
 5 echo "shel1 数组介绍"
 6 echo "1.读取数组元素值的一般格式,例如:"
 7 my_array=(A B "C" D)
 8 echo "第一个元素为: ${my_array[0]}"
 9 echo "第二个元素为: ${my_array[1]}"
10 echo "第三个元素为: ${my_array[2]}"
11 echo "第四个元素为: ${my_array[3]}"
12 echo "2.获取数组中的所有元素: 使用 或 * 可以获取数组中的所有元素,例如:"
13 my_array=(A B "C" D)
14 echo "数组的元素为: ${my_array[*]}"
15 echo "数组的元素为: ${my_array[@]}"
16 echo "3.获取数组的长度: 获取数组长度的方法与获取字符串长度的方法相同,例如:"
17 my_array=(A B "C" D)
18 
19 
20 echo "数组元素个数为: ${#my_array[*]}"
21 echo "数组元素个数为: ${#my_array[@]}"
22 echo "************************************************"
23 echo "shel1 数组遍历的3种方法"
24 echo "创建一个数组"
25 array=( A B C D 1 2 3 4)
26 echo "1.标准的for循环"
27 for(( i=0;i<${#array[@]};i++)) do
28 #${#array[@}获取数组长度用于循环
29 echo -e "\e[1;32m ${array[i]} \e[0m"
30 done;
31 
32 echo "2.for ... in"
33 echo "2.1 遍历(不带数组下标)"
34 for element in ${array[@]}
35 #也可以写成for element in $tarray[*]}
36 do
37 echo -e "\e[1;32m $element \e[0m"
38 done
39 
40 echo "2.2 遍历(带数组下标)"
41 for i in "${!array[@]}";
42 do
43 #printf "%s\t%s\n" "$i" "${array[$i]}"
44 printf "\e[1;32m %s\t%s\n $i ${array[$i]} \e[0m\n"
45 done
46 echo "3.while循环法"
47 i=0
48 while [ $i -lt ${#array[@]} ]
49 #当变量(下标)小于数组长度时进入循环体
50 do
51 echo -e "\e[1;32m ${array[$i]} \e[0m"
52 #按下标打印数组元素
53 let i++
54 done
55 
56 echo "4.我的示例"
57 pos=0
58 array=( 20230715 20230826 20230903 )
59 for element in ${array[@]}
60 do
61 end_date=$element
62 start_date="${element:0:6}01"
63 let pos++
64 echo -e "\e[1;32m 序号: echo ${pos}, start_date: ${start_date}, end_date: ${end_date} \e[0m"
65 done
66 
67 
68 
69 
70 }
71 
72 main $@
代码展示:vim test.sh

 

注解:start_date="${element:0:6}01"       ${element:0:6}用到了字符串截取功能,${element:0:6}01然后采用字符串拼接字符01

 

shell 数组比较

shell 实现数组比较,取元素的并集、交集时,可以使用sort排序、uniq统计和awk数据过滤

array_1=("w1" "w2" "w3" "w4" "w5" "w6")
array_2=("w2" "w4" "w6" "w8")

array_3=("w6" "w5" "w4" "w3" "w2" "w1")


# 获取并集,A ∪ B
array_union=(`echo ${array_1[*]} ${array_2[*]}|sed 's/ /\n/g'|sort|uniq`)
echo "数组:array_1 与 array_2 的并集为: ${array_union[*]}"

# 获取交集,A n B
array_inter=(`echo ${array_1[*]} ${array_2[*]}|sed 's/ /\n/g'|sort|uniq -c|awk '$1!=1{print $2}'`)
echo "数组:array_1 与 array_2 的交集为:${array_inter[*]}"

# 对称差集,不属于 A n B
array_4=(`echo ${array_1[*]} ${array_2[*]}|sed 's/ /\n/g'|sort|uniq -c|awk '$1==1{print $2}'`)
echo "数组:array_1 与 array_2 的对称差集为:${array_4[*]}"

#对称集为空,则数组相等
if [ "`echo ${array_1[*]} ${array_3[*]}|sed 's/ /\n/g'|sort|uniq -c|awk '$1==1{print $2}'`" == "" ];then
echo "数组:array_1 与 数组:array_3 内容相同,数组相等..."
else
echo "数组:array_1 与 array_3 的对称差集为:`echo ${array_1[*]} ${array_2[*]}|sed 's/ /\n/g'|sort|uniq -c|awk '$1==1{print $2}'`"
fi
代码

 

posted on 2023-08-30 16:24  NG-承  阅读(14)  评论(0编辑  收藏  举报

导航