shell 二维数组使用 select使用

#!/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]}" 




 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值