shell学习二十九--数组

来源:互联网 发布:java bigdecimal 编辑:程序博客网 时间:2024/04/28 03:43
shell数组
数组:简单的说就是相同数据类型的元素按一定顺序排列的组合。
数组是把有限的类型相同的变量用一个名字命名,然后用用编号区分他们的变量的集合。
这个名字成为数组名,编号成为数组下标。

何为数组?学过计算机编程语言的同学都知道,数组的特性就是一组数据类型相同的集合
(不包括有一些编程语言提出来的关联数组的概念)。那么shell中数组是怎么定义的呢,
我们来看两种数据类型:一是数值类型,二是字符串类型;虽然shell本身是弱类型的,
但也可以这么区分。

一堆元素的集合。

数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开。
举个列子: 
arr_number=(1 2 3 4 5);
字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。
arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');

数组的定义与增删改查
方法1:array=(value1 value2 value3...)
数组定义
[root@node01 ~]# array=(1 2 3)

获取数组的长度
[root@node01 ~]# echo ${#array[@]}
3
[root@node01 ~]# echo ${#array[*]}
3

数组打印
[root@node01 ~]# echo ${array[0]} 
1
[root@node01 ~]# echo ${array[1]}
2
[root@node01 ~]# echo ${array[2]}
3
[root@node01 ~]# echo ${array[4]}

[root@node01 ~]#
[root@node01 ~]# echo ${array[@]}
1 2 3

数组赋值
[root@node01 ~]# array[3]=4       往数组添加值
[root@node01 ~]# echo ${array[@]}
1 2 3 4
[root@node01 ~]# echo ${array[3]}
4
[root@node01 ~]# array[1]=wolf
[root@node01 ~]# echo ${array[@]}
1 wolf 3 4
[root@node01 ~]# array=(1 2 3)
[root@node01 ~]# unset array[0]
[root@node01 ~]# echo ${array[@]}
2 3
[root@node01 ~]# 

数组删除
[root@node01 ~]# unset array
[root@node01 ~]# echo ${array[@]}
[root@node01 ~]# 

截取
[root@node01 ~]# echo ${#array[@]}
2
[root@node01 ~]# array=(1 2 3 4 5)
[root@node01 ~]# echo ${array[@]:2:3}   第二个开始截取,取3个
3 4 5
[root@node01 ~]# echo ${array[@]:2}  
3 4 5
[root@node01 ~]# echo ${array[@]:2}
3 4 5
[root@node01 ~]# echo ${array[@]:1}
2 3 4 5
[root@node01 ~]# echo ${array[@]:0}
1 2 3 4 5

替换(变量子串等操作)
[root@node01 ~]# echo ${array[@]/3/4}
1 2 4 4 5
调用语法是:${@或者*/查找字符/替换字符}该操作不会改变原先数组内容,如果需要修改,可以看上面的例子,重新定义数组。
[root@node01 ~]# array=(1 2 3 4 5)
[root@node01 ~]# array1=(${array[@]/2/4})  2替换为4
[root@node01 ~]# echo ${array1[@]}
1 4 3 4 5

应用
array=($(ls))
[root@node01 ~]# echo ${#array[@]}
21
[root@node01 ~]# echo ${array[1]} 
apache-maven-3.3.9-bin.tar.gz
[root@node01 ~]# echo ${array[@]}
anaconda-ks.cfg apache-maven-3.3.9-bin.tar.gz bind-9.10.6 bind-9.10.6.tar.gz Desktop Documents 
Downloads etc_2017-07-29.tar.gz file grep.log install.log install.log.syslog jenkins.war Music Pictures 
Public Templates tmp_2017-07-29.tar.gz Videos whoami-strace.txt wolf

[root@node01 ~]# for ((i=0; i<${#array[@]};i++));do echo ${array[$i]};done
anaconda-ks.cfg
apache-maven-3.3.9-bin.tar.gz
bind-9.10.6
bind-9.10.6.tar.gz
Desktop
Documents
Downloads
etc_2017-07-29.tar.gz
file
grep.log
install.log
install.log.syslog
jenkins.war
Music
Pictures
Public
Templates
tmp_2017-07-29.tar.gz
Videos
whoami-strace.txt
wolf

[root@node01 ~]# for i in ${array[@]};do echo $i;done   
anaconda-ks.cfg
apache-maven-3.3.9-bin.tar.gz
bind-9.10.6
bind-9.10.6.tar.gz
Desktop
Documents
Downloads
etc_2017-07-29.tar.gz
file
grep.log
install.log
install.log.syslog
jenkins.war
Music
Pictures
Public
Templates
tmp_2017-07-29.tar.gz
Videos
whoami-strace.txt
wolf

[root@node01 day13]# vi sz.sh 
#!/bin/sh
array=(laolang wolf zhangs)
for ((i=0; i<${#array[*]}; i++))
do
  echo "this is $i,then content is ${array[$i]}"
done
[root@node01 day13]# sh sz.sh 
this is 0,then content is laolang
this is 1,then content is wolf
this is 2,then content is zhangs


[root@node01 day13]# vi sz.sh 
#!/bin/sh
array=(laolang wolf zhangs)
for ((i=0; i<${#array[*]}; i++))
do
  echo "this is $i,then content is ${array[$i]}"
done

for i in ${array[@]}
do
  echo "$i"
done
[root@node01 day13]# sh sz.sh 
this is 0,then content is laolang
this is 1,then content is wolf
this is 2,then content is zhangs
laolang
wolf
zhangs

数组小结:
定义
array=(1 2 3)
array=($(ls))
打印
${array[@]}所有元素
${#array[@]}所有元素
${array[i]} 单个元素,i是下标
取数组的部分

检查网站url地址
[root@node01 day13]# cat array01.sh 
#!/bin/bash
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#define array url list
array=(
http://www.etiantian.org
http://www.taobao.com
http://oldboy.blog.51cto.com
http://www.baidu.com
)
#check_url
wait(){
echo -n "wait 3s"
for((i=0;i<3;i++))
do
  echo -n "."
  sleep 1
done
echo 
}
check_url(){
  wget -T 5 -t 2 --spider $1 &>/dev/null
  RETVAL=$?
  if [ $RETVAL -eq 0 ];then
      action "check $1"  /bin/true
  else
      action "check $1"  /bin/false   
  fi
  return $RETVAL
}
main(){
  wait
  for((i=0;i<${#array[@]};i++))
  do
    check_url ${array[i]}
  done
}
main

[root@node01 day13]# sh array01.sh 
wait 3s...
check http://www.etiantian.org                             [  OK  ]
check http://www.taobao.com                                [FAILED]
check http://oldboy.blog.51cto.com                         [  OK  ]
check http://www.baidu.com                                 [  OK  ]