shell中数组的操作

数组在shell中的用法

在写shell脚本时,有时也希望像C语言那样去使用数组,bash是支持一维数组的。本文主要介绍在shell脚本中关于数组的应用,包括数组的定义、读取、替换、删除和复制。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

1.数组定义

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:

数组名=(值123 ...)
或者
数组名=(
值123
...
)
或者
value1=值1
value2=值2
value3=值3
数组名[0]=$value1
数组名[1]=$value2
数组名[2]=$value3
或者
数组名="值1 值2 值2 ..."
或者
数组名=([0]=值1 [1]=值2 [2]=值3 )

例如:

prov=("hebei" "shandong" "qinghai" "shanxi")

或者

prov=(
"hebei"
"shandong"
"qinghai"
"shanxi"
)

或者通过变量创建数组

HB="hebei"
SD="shandong"
QH="qinghai"
SX="shanxi"
prov[0]=$HB
prov[1]=$SD
prov[2]=$QH
prov[3]=$SX

或者

prov="hebei shandong qinghai shanxi" # echo ${prov[0|@|*]},把prov变量当作数组来处理,但数组元素只有字符串本身

或者
prov=( [1]=hebei [2]=shandong [3]=qinghai [4]=shanxi )
可以不使用连续的下标,而且下标的范围没有限制。

2.读取数组

读取数组的格式如下:

${数组名[下标]}

例如:

echo ${prov[0]}

使用@符号可以获取数组中的所有元素,例如:

echo ${prov[@]}

3.获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

length=${#prov[@]} #4
或者
length=${#prov[*]} #4
或者
length=${#prov[n]} #5
或者
prov=${#prov} #5
或者
length=${#prov[0] }#5

4.数组的删除

unset prov[1] # 删除数组中第一个元素
unset prov # 删除整个数组

5.分片读取

格式如下:

${数组名[@]:起始位置:个数}

例如:

${prov[@]:1} # shandong qinghai shanxi
${prov[@]:0:2} # hebei shandong
${prov[@]:1:2} # shandong qinghai
${prov[@]:(-1):2} #shanxi

6.模式替换

格式为:

${数组名[@或*]/模式/新值}

例如:

${prov[@]/he/0315} #0315bei shandong qinghai shanxi

7.数组的遍历

for v in ${#prov[@]}; do
    echo $v;
done

或者

for ((i=0;i<${#prov[*]};i++))
do
    echo ${prov[i]}
done

或者

for p in ${prov[@]}
do
    echo $p
done

8.应用

例1 read -a参数,从标准输入中读取数组,再做操作

#!/bin/bash
echo "Please enter the provinces:"
read -a prov
i=0
while [ $i -lt ${prov[@]} ]
do
    echo ${prov[i]}
done

例2 检查URL地址的脚本

#!/bin/bash
url_list=(
http://etiantian.org
http://www.linuxpeixun.com
http://oldboy.blog.51cto.com
)
function wait()
{
    echo -n '3秒后,执行该操作.';
    for ((i=0;i<3;i++))
    do
        echo -n ".";sleep 1
    done
    echo
}
function check_url()
{
    wait
    echo 'check url...'
    for ((i=0; i<${#url_list[*]}; i++))
    do
        # HTTP/1.1 200 OK
        judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))
        if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK'  ]]
        then
            echo "${url_list[$i]}[OK]" 
        else
            echo "${url_list[$i]}[OK]" 
        fi
    done
}
check_url

例3 实现lvs负载均衡健康检查及自动剔除和自动加入RS的脚本

#!/bin/bash
#未测试
PORT="80"
VIP=192.168.1.181
RIP=(
    192.168.1.178
    192.168.1.179
)
function check_url()
{
    for ((i=0; i< ${#RIP[*]}; i++))
    do
        judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n"))
        if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK'  ]]
        then
            if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1  ]
            then
                ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT
            fi
        else
        if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1  ]
        then
            ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
        fi
    done
}

while true
do
    check_url
    sleep 5
done

例4 判断某个变量是否在数组中

#!/bin/bash
prov=(qinghai shandong shanxi)
var=xian
[[ ${prov[@]/$var/} != ${prov[@]} ]] && echo 'yes' || echo 'no'

参考文章

http://blog.51cto.com/oldboy/1055734
http://blog.csdn.net/jerry_1126/article/details/52027539
http://www.jb51.net/article/52382.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值