Shell数组的定义与增删改查
Shell数组就是一个元素集合,它把有限个元素用一个名字来命令,然后用编号对他们进行区分。这个名字就是数组名,用于区分不同内容的编号就称为数组下标。
Shell数组的定义
Shell数组的定义有多种方法
方法1:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格进行分割。
语法如下:array=(value1 value2 value3 ...)
示例:
[root@CentOS7-1511-clone ~]# array=(1 2 3) [root@CentOS7-1511-clone ~]# echo ${array[*]} 1 2 3
方法2:用小括号将变量值括起来,同时采用键值对的形式赋值
语法如下:array=([1]=one [2]=two [3]=three)
此种方法为key-value键值对的形式
示例:
[root@CentOS7-1511-clone ~]# array=([1]=one [2]=two [haha]=three) [root@CentOS7-1511-clone ~]# echo ${array[haha]} three
这种情况下不能使用数组下标取值
上面的方法还可以使用下面这种形式表示
语法:array[0]=a;array[1]=b;array[haha]=three
示例:
[root@CentOS7-1511-clone ~]# array[0]=a;array[1]=b;array[haha]=three [root@CentOS7-1511-clone ~]# echo ${array[haha]} three
其实跟方法2是一样的
方法3:动态地定义数组变量,并使用命令的输出结果作为数组的内容
语法:array=($(命令))
或array=(
命令)
示例:
[root@CentOS7-1511-clone ~]# mkdir -p /array [root@CentOS7-1511-clone ~]# touch /array/{1..3}.txt [root@CentOS7-1511-clone ~]# ll /array/ 总用量 0 -rw-r--r-- 1 root root 0 4月 9 17:55 1.txt -rw-r--r-- 1 root root 0 4月 9 17:55 2.txt -rw-r--r-- 1 root root 0 4月 9 17:55 3.txt [root@CentOS7-1511-clone ~]# array=($(ls /array)) [root@CentOS7-1511-clone ~]# echo ${array[*]} 1.txt 2.txt 3.txt
Shell数组的定义的使用方法
打印数组元素
[root@CentOS7-1511-clone ~]# array=(one two three) [root@CentOS7-1511-clone ~]# echo ${array[0]} one [root@CentOS7-1511-clone ~]# echo ${array[1]} two [root@CentOS7-1511-clone ~]# echo ${array[2]} three
打印数组元素的个数
[root@CentOS7-1511-clone ~]# echo ${array[*]} #<==使用*或@可以得到整个数组的内容 one two three
[root@CentOS7-1511-clone ~]# echo ${#array[*]} #<==${#数组名[*]}可以得到数组的长度,这个和变量子串的方法一样,因为数组也是特殊的变量 3
数组赋值
可以通过"数组名[下标]"对数组进行引用赋值,如果下标不存在,则自动添加一个新的数组元素,如果下标存在则覆盖原来的值。
示例:
[root@CentOS7-1511-clone ~]# echo ${array[*]} one two three [root@CentOS7-1511-clone ~]# array[3]=four #<==下标3原本不存在 [root@CentOS7-1511-clone ~]# echo ${array[*]} one two three four
数组的删除
数组的本质还是变量,因此可通过"unset 数组[下标]"清楚相应的数组元素,如果不带下标则表示清楚整个数组的所有数据
示例:
[root@CentOS7-1511-clone ~]# echo ${array[*]} one two three four [root@CentOS7-1511-clone ~]# unset array[1] [root@CentOS7-1511-clone ~]# echo ${array[*]} one three four
Shell数组脚本开发实践
示例1:
#!/bin/sh array=(1 2 3 4 5) for i in ${array[*]} do echo $i done 结果: 1 2 3 4 5
示例2:找到并删除10天前的日志
#!/bin/bash #### 加载zdlh函数库和配置项 [ -e $HOME/bin/zd-profile ] && . $HOME/bin/zd-profile Delete_date=$(date -d "-10 day" +%Y-%m-%d) #LOGPATH=$(ls -d $HOME/app/zd*/logs/) LOGPATH_path=($GT_FILE_EUREKA $GT_FILE_CMS $GT_FILE_WEB $GT_FILE_TASK $GT_FILE_MONITOR $GT_FILE_MESSAGE) for i in ${LOGPATH_path[*]} do [ ! -d ${i}/logs ] && continue #检测是否有10天的日志文件 logfile_count=$(find ${i}/logs -mtime +3 -name "spring.log.*"|wc -l) if [ $logfile_count -ne 0 ];then #删除创建日期在10天前的日志 find ${i}/logs -mtime +10 -name "spring.log.*" -exec rm -f {} \; else #获取spring.log中10天前日志的最后行数 log_file=${i}/logs/spring.log log_line=$(/bin/awk '{t=$1; if(t<"'$Delete_date'") {if(length !=0)print NR}}' ${log_file}|tail -n1) if [ -z $log_line ];then continue else #删除spring.log中10天前的内容 sed -i '1,'$log_line''d ${log_file} fi fi done