1. 程式人生 > >Linux 命令詳解(十)Shell腳本的數組詳解

Linux 命令詳解(十)Shell腳本的數組詳解

cti err art case lin start shell pre round

1、數組定義

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

一對括號表示是數組,數組元素用“空格”符號分割開。

2、數組讀取與賦值
1)得到長度

[[email protected] ~]# echo ${#a[@]}
8
[[email protected]-IDC ~]# echo ${#a[*]}
8

用${#數組名[@或*]} 可以得到數組長度

2)讀取:

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

用${數組名[下標]} 下標是從0開始 下標是:*或者@ 得到整個數組內容

3)賦值:

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

直接通過 數組名[下標] 就可以對其進行引用賦值,如果下標不存在,自動添加新一個數組元素

4)刪除:

[[email protected] ~]# a=(1 2 3 4 5 6 7 8)
[[email protected]-IDC ~]# unset a
[[email protected]-IDC ~]# echo ${a[*]}

[[email protected]-IDC ~]# a=(1 2 3 4 5 6 7 8)
[[email protected]-IDC ~]# unset a[1]
[[email protected]
-IDC ~]# echo ${a[*]} 1 3 4 5 6 7 8 [[email protected]-IDC ~]# echo ${#a[*]} 7

直接通過:unset 數組[下標] 可以清除相應的元素,不帶下標,清除整個數據。

3、特殊使用
1)分片:

[[email protected] ~]# a=(1 2 3 4 5 6 7 8)
[[email protected]-IDC ~]# echo ${a[@]:0:3}
1 2 3
[[email protected]-IDC ~]# echo ${a[@]:1:4}
2 3 4 5
[[email protected]-IDC ~]# c=(${a[@]:1:4})
[[email protected]-IDC ~]# echo ${#c[@]}
4
[[email protected]-IDC ~]# echo ${c[*]} 
2 3 4 5

直接通過 ${數組名[@或*]:起始位置:長度} 切片原先數組,返回是字符串,中間用“空格”分開,因此如果加上”()”,將得到切片數組,上面例子:c 就是一個新數據。

2)替換:

[[email protected] ~]# a=(1 2 3 4 5 6 7 8)
[[email protected]-IDC ~]# echo ${a[@]/3/100}
1 2 100 4 5 6 7 8
[[email protected]-IDC ~]# echo ${a[@]}
1 2 3 4 5 6 7 8
[[email protected]-IDC ~]# a=(${a[@]/3/100})
[[email protected]-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

Linux 命令詳解(十)Shell腳本的數組詳解