数组在shell中的用法
在写shell脚本时,有时也希望像C语言那样去使用数组,bash是支持一维数组的。本文主要介绍在shell脚本中关于数组的应用,包括数组的定义、读取、替换、删除和复制。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
1.数组定义
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
数组名=(值1 值2 值3 ...)
或者
数组名=(
值1
值2
值3
...
)
或者
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