#!/bin/bash
echo "------------------------------${date}------------------------------------------"
# function test2(){
# echo "start test2() ......"
# echo "2即将执行创建镜像操作,确认请按任意键继续,按'n'跳过创建镜像操作】:"
# read confirm_opt
# confirm_opt=$(echo "$confirm_opt" | tr '[:upper:]' '[:lower:]')
# echo "confirm_opt=$confirm_opt"
# if [ "$confirm_opt" = "no" ] || [ "$confirm_opt" = "n" ]; then
# echo "test2()跳过创建镜像操作"
# return 1
# fi
# echo "end test2() ......"
# }
# test2
# echo "-----------------------------------"
# 使用关联数组来存储行索引(键)和对应的一维数组(值)nx3矩阵
# app_list[0]=(19999 sso CAS)
# app_list[1]=(19000 platform A系统)
# app_list[2]=(19001 emer B系统)
# app_list[3]=(19002 plan C系统)
# app_list[4]=(19003 edms D系统)
# app_list[5]=(19004 amap E系统)
# app_list[6]=(19005 drill F系统)
# app_list[7]=(19006 portal G系统)
# for app in "$app_list[@]"
# do
# echo ${app}
# done
# 一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的字符串,
# 但是改为 A=(a b c def) ,则是将 $A 定义为组数…
# bash 的组数替换方法可参考如下方法:
# ${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
# ${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数…
# ${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
# ${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)
# A[3]=xyz 则是将第四个组数重新定义为 xyz
# Bashshell中使用数组变量,其赋值/定义有两种:
# 1. name=(value1 ... valuen)此时下标从0开始,也可以这样做:name=([1]=a [2]=b [0]=c)
# 2. name[index] =value
# 3. declare -a arrayname=(element1 element2 element3)
# 4. declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora') # 如果单个元素包括括号
# 操作方式:
# 1. 数组长度:${#arrary[@]}
# 2. 遍历数组:for i in ${array[@]} ; do ; echo $i 或者如下:
# 先得到这个数组的有效索引:${!array[@]},然后利用 array[$index]来操作。例如:A={[1]=2 [3]=4 [4]=5}
# for idx in ${!A[@]} ; do echo ${idx}_${A[$idx]} ; done
# 需要注意的是 ${A[*]}与${A[@]}的区别:
# 当两者都没有用""括起来的时候也就是${A[@]} ${A[*]}的效果是一样的,但是有了""
# "${A[@]}" :最大限度的保持原意,比如A[1]='a b' 那么这样输出的也是a b这是一个整体,而如果没有"",这输出的是a b这是两个元素!
# "${A[*]}":所有的元素都变成一个字符串了,也就是一个整体
# 3. 取某一个元素:array[index], 如果单个元素里面包含多个空格,那么保留这多个空格需要"",比如echo "${array[2]}"
# 4. 使一个字符串变bash shell 数组,可以放在文件里面,然后source file,但是这个file里面的内容的是:array=(value1 value2 ... valuen)这种形式,还有一种最简单的做法:array=(`cat filename`)(此时filename里面就不是array=这种形式了,而是直接value1 value2 value3...) 或者array=(content)
# 5. 清除一个数组,清0, unset arrayname
# 6. 连接两个数组,array=("${array1[@]}" "${array2[@]}"),用""的目的是防止元素本身包含空格,前面已经提到过
# 7. 复制一个数组,跟上面连接一样array= ("${array1[@]}")
# 8. 数组添加元素,原理也跟上面一样 array= ("${array1[@]}" "xx")
# 9. 提取数组的元素,${array[@]:3:2} 从第三个位置开始,取两个元素。如果是针对一个元素提取(相当于substring)${array[index]:start:len}
# 貌似bash shell中没有多维数组,那么该怎么实现呢?我自己想了一个比较笨的方法,这个方法也得对数据的组织形式有要去:
# 普通的我们一维数组是这样的:
# a=(1 2 3 4 5 6)
# 假设需要一个二维数组:
# b=(1 2 3,4 5 6,7 8 9)
# 当然这种写法是不对的,只是便于理解而已。此时我们可以再构造二维数组之前写一个这样的二维数组:
# a=('1 2 3' '4 5 6' '7 8 9')
# 然后我们可以利用
# for i in "${a[@]}" ; do
# echo $i #这一步就得到了每一行,而如果我们需要二维数组,那么可以这样做
# done
# for i in "${a[@]}" ; do
# b=($i) #此时b就相当于二维数组里面的一维数组了,然后可以再次遍历
# for j in "${b[@]}"; do
# do someting
# done
# done
# 其实我们有时候完全可以这样做:构造成这样:a=(1 2 3 4 5 6 7 8 9),然后操作的时候利用第i行j列的元素等于i*len+j,len是数组的第二维度大小,这样做有时候更简单,但是就必须得控制一下边界了,比如3*3的数组,你可能初始化只给出8个元素。
now_time=$(date "+%Y%m%d%H%M%S")
# 模拟二维数组,3x3矩阵
all_list=(
"19999 sso CAS"
"19000 platform A系统"
"19001 emer B系统"
"19002 plan C系统"
"19003 edms D系统"
"19004 amap E系统"
"19005 drill F系统"
"19006 portal G系统"
)
echo "all_list数组长度:${#all_list[@]}"
echo "all_list有效索引:${!all_list[@]}"
echo "all_list所有元素:${all_list[@]}"
echo "---------------$now_time--------------------"
#遍历数组
function loop_app_list(){
#数组的有效索引 ${!all_list[@]} #--有效索引:0 1 2 3 4 5 6 7
echo "all_list数组长度:${#all_list[@]}"
echo "all_list有效索引:${!all_list[@]}"
echo "all_list所有元素:${all_list[@]}"
for row_index in "${!all_list[@]}"; do
row=${all_list[$row_index]}
IFS=' ' read -ra line <<< "$row"
echo "row:$row"
for col_index in "${!line[@]}"; do
echo "矩阵位置: (${row_index}, ${col_index}): ${line[$col_index]}"
done
echo "-----------------------------------"
done
echo "finish loop---------------$now_time--------------------"
}
# loop_app_list
echo "请选择要部署的系统:"
select app in "${all_list[@]}";do
echo "已选择:$REPLY。 当前选择的部署目录为:$app"
break
done
echo "app=$app"
echo "---------------$now_time--------------------"
# 方式1:再次获取一维数组
choose_items=($app)
# 方式2:再次获取一维数组
# IFS=' ' read -ra choose_items <<< "$app"
echo "choose_items 数组长度:${#choose_items[@]}"
echo "choose_items 有效索引:${!choose_items[@]}"
echo "choose_items 所有元素:${choose_items[@]}"
echo "choose_items 元素1:${choose_items[0]}"
echo "choose_items 元素2:${choose_items[1]}"
echo "choose_items 元素3:${choose_items[2]}"
shell 二维数组使用 select使用
于 2024-05-06 10:55:21 首次发布