Linux 命令详解(十)Shell脚本的数组详解

1、数组定义

[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8)
[root@bastion-IDC ~]# echo $a

一对括号表示是数组,数组元素用“空格”符号分割开。

2、数组读取与赋值
1)得到长度

[root@bastion-IDC ~]# echo ${#a[@]}
8
[root@bastion-IDC ~]# echo ${#a[*]}
8

用${#数组名[@或*]} 可以得到数组长度

2)读取:

[root@bastion-IDC ~]# echo ${a[4]}
5
[root@bastion-IDC ~]# echo ${a[*]}
1 2 3 4 5 6 7 8

用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容

3)赋值:

[root@bastion-IDC ~]# a[1]=100
[root@bastion-IDC ~]# echo ${a[*]} 
1 100 3 4 5 6 7 8
[root@bastion-IDC ~]# a[5]=140
[root@bastion-IDC ~]# echo ${a[*]} 
1 100 3 4 5 140 7 8

直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素

4)删除:

复制代码
[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8)
[root@bastion-IDC ~]# unset a
[root@bastion-IDC ~]# echo ${a[*]}

[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8)
[root@bastion-IDC ~]# unset a[1]
[root@bastion-IDC ~]# echo ${a[*]}
1 3 4 5 6 7 8
[root@bastion-IDC ~]# echo ${#a[*]}
7
复制代码

直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。

3、特殊使用
1)分片:

复制代码
[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8)
[root@bastion-IDC ~]# echo ${a[@]:0:3}
1 2 3
[root@bastion-IDC ~]# echo ${a[@]:1:4}
2 3 4 5
[root@bastion-IDC ~]# c=(${a[@]:1:4})
[root@bastion-IDC ~]# echo ${#c[@]}
4
[root@bastion-IDC ~]# echo ${c[*]} 
2 3 4 5
复制代码

直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。

2)替换:

[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8)
[root@bastion-IDC ~]# echo ${a[@]/3/100}
1 2 100 4 5 6 7 8
[root@bastion-IDC ~]# echo ${a[@]}
1 2 3 4 5 6 7 8
[root@bastion-IDC ~]# a=(${a[@]/3/100})
[root@bastion-IDC ~]# echo ${a[@]}
1 2 100 4 5 6 7 8

调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。

4、截取自己需要的数组元素

复制代码
#!/bin/bash
SERVER=$1
echo '------starting----------'
SERVERS=('192.168.1.10' '192.168.10.10' '192.168.10.11' '192.168.10.12' '192.168.10.13' '192.168.100.100')

#for i in ${SERVERS[@]}
#do
#  echo "--"$i
#done

# [01]
function log() {
    if [ $1 == "info" ]; then
        echo -e "\033[32;40m$2\033[0m"
    elif [ $1 == "error" ]; then
        echo -e "\033[31;40m$2\033[0m"
    elif [ $1 == "debug" ]; then
        echo -e "\033[34;40m$2\033[0m"
    fi
}

PUSH_SERVER=${SERVERS[0]}
PROXY_SERVER=${SERVERS[${#SERVERS[*]}-1]}
echo "PUSH_SERVER = "$PUSH_SERVER
echo "PROXY_SERVER = "$PROXY_SERVER

#echo "获取数组的长度1 = "${#SERVERS[@]}

unset SERVERS[0]
unset SERVERS[${#SERVERS[@]}]

#echo "获取数组的长度2 = "${#SERVERS[@]}

echo '------------------------------before-------------------'

# condition install:
case $SERVER in
    #------------------------------------------------------------------------------------
    # 推流分发录像服务器
    #------------------------------------------------------------------------------------
    # [1] 推流
    ######################################################################################
    "${PUSH_SERVER}")
    sleep 1
    ;;
    #------------------------------------------------------------------------------------
    # 反向代理Proxy
    #------------------------------------------------------------------------------------
    ######################################################################################
    #"${SERVERS[3]}") 获取数组的最后一个元素为直播节点CDN
    "${PROXY_SERVER}")
    sleep 1
    ;;
    *)
    log debug "------------------ CURRENT IP-------------------"${SERVER}
    for i in ${SERVERS[@]}
    do
      echo "--"$i
    done
    ;;
esac
复制代码

 

posted @   Tinywan  阅读(12673)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2016-10-17 FFPEG 转码记录------解决了有流,但是没有码率和FPS?
点击右上角即可分享
微信分享提示