题主你好,
目前成都创新互联公司已为近千家的企业提供了网站建设、域名、网站空间、网站托管运营、企业网站设计、鄂托克网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
代码及测试截图如下:
下面这个例子可能对题主有帮助:
说明: array和array1是两个数组, 其中的内容分别为aa bb cc和dd ee ff, 然后再定义一个数组array2,这个数组中的元素为array和array1,最后使用for循环,通过array2数组将array和array1中的元素输出.
希望可以帮到题主, 欢迎追问.
首先要告诉大家,Bash Shell 只支持一维数组,而且初始化的时候不用定义数组的大小。
(一) 定义数组,方法1:使用小括号赋值
array1=(A B C D)或者array1=("A" "B" "C" "D")
定义数组,方法2:使用数组下表挨个赋值
array2[0]=a
array2[1]=b
可能会有朋友会问问什么不用declare声明也能用,在这跟大家拓展下,所有变量不用显式定义都能用作数组,所以用不用declare声明都可以
(二) 读取数组
${array[下标值]},例如:${array1[2]}
若要获取数组中全部的值,使用${array[*]}或者${array[@]}
(三) 获取数组长度 ${#array1[*]},关键在加了个#
(四) 删除数组内容元素 unset ${array1[下标]} ,删除整个数组 unset array1
数组的赋值操作有问题,改成下面这样:
for ubootfile in $uboot_list
do
FILE=`find . -name $ubootfile -print -quit`
if [ -n "$FILE" ]; then
a=(${a[@]} $FILE)
else
b=(${b[@]} $FILE)
fi
done
echo "found files:"
echo ${a[@]}
echo "missing files:"
echo ${b[@]}
下面是数组操作的讲解,请参考:
数组作为一种特殊的数据结构在任何一种编程语言中都有它的一席之地,当然bashshell也不例外。本文就shell数组来做一个小的总结。
在这里只讨论一维数组的情况,关于多维数组(事实上,你得用一维数组的方法来模拟),不涉及。这里包括数组的复制,计算,删除,替换。
数组的声明:
1)array[key]=value # array[0]=one,array[1]=two
2)declare -a array # array被当作数组名
3)array=(value1 value2 value3 ... )
4)array=([1]=one [2]=two [3]=three ... )
5)array="one two three" # echo ${array[0|@|*]},把array变量当作数组来处理,但数组元素只有字符串本身
数组的访问:
1)${array[key]} # ${array[1]}
数组的删除
1)unsetarray[1] # 删除数组中第一个元素
2)unset array # 删除整个数组
计算数组的长度:
1)${#array}
2)${#array[0]}#同上。 ${#array[*]} 、${#array[@]}。注意同#{array:0}的区别
数组的提取
从尾部开始提取:
array=( [0]=one [1]=two [2]=three [3]=four )
${array[@]:1} # two three four,除掉第一个元素后所有元素,那么${array[@]:0}表示所有元素
${array[@]:0:2} # one two
${array[@]:1:2} # two three
子串删除
[root@localhostdev]# echo ${array[@]:0}
one two three four
[root@localhostdev]# echo ${array[@]#t*e} # 左边开始最短的匹配:"t*e",这将匹配到"thre"
one two e four
[root@localhostdev]# echo ${array[@]##t*e} # 左边开始最长的匹配,这将匹配到"three"
[root@localhostdev]# array=( [0]=one [1]=two [2]=three [3]=four )
[root@localhostdev]# echo ${array[@] %o} # 从字符串的结尾开始最短的匹配
one tw three four
[root@localhostdev]# echo ${array[@] %%o} # 从字符串的结尾开始最长的匹配
one tw three four
子串替换
[root@localhostdev]# array=( [0]=one [1]=two [2]=three [3]=four )
第一个匹配到的,会被删除
[root@localhostdev]# echo ${array[@] /o/m}
mne twm three fmur
所有匹配到的,都会被删除
[root@localhostdev]# echo ${array[@] //o/m}
mne twm three fmur
没有指定替换子串,则删除匹配到的子符
[root@localhostdev]# echo ${array[@] //o/}
ne tw three fur
替换字符串前端子串
[root@localhostdev]# echo ${array[@] /#o/k}
kne two three four
替换字符串后端子串
[root@localhostdev]# echo ${array[@] /%o/k}
one twk three four
用eval,可以把字符串当作命令来执行:
val=2
eval "x=\$$val"
echo $x
2. 用"$@"把参数列表转化成数组
val=1
x=( "$@" )
echo "${x[$val]}"
注意:数组是从0开始的,也就是 ${x[0]} 对应 $1、${x[1]} 对应 $2,依次类推……
一、awk if分支结构
二、awk数组 for循环
一、awk if分支结构
案例1
awk过滤中的if分支结构
1)单分支
统计/etc/passwd文件中UID小于或等于1000的用户个数:
统计/etc/passwd文件中UID大于1000的用户个数:
统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数:
2)双分支
分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数:
分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数:
二、awk数组
注意,awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号:
案例3:awk扩展应用
1)awk统计Web访问排名
在分析Web日志文件时,每条访问记录的第一列就是客户机的IP地址,其中会有很多重复的IP地址。因此只用awk提取出这一列是不够的,还需要统计重复记录的数量并且进行排序。
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。
针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序
实现此案例需要按照如下步骤进行。
步骤一:统计Web访问量排名
分步测试、验证效果如下所述。
1)提取IP地址及访问量
2)对第1)步的结果根据访问量排名
案例4:编写监控脚本
本案例要求编写脚本,实现计算机各个性能数据监控的功能,具体监控项目要求如下:
CPU负载
网卡流量
内存剩余容量
磁盘剩余容量
计算机账户数量
当前登录账户数量
计算机当前开启的进程数量
本机已安装的软件包数量
步骤
实现此案例需要按照如下步骤进行。
步骤一:准备工作
1)查看性能数据的命令
步骤二:编写参考脚本
1)脚本内容如下:
awk是一个强大的文本分析工具,与grep、sed相比,awk在对数据分析并生成报告时,显得有很大的优势。
awk有三个不同的版本:awk、nawk和gawk,在没有做特殊说时的时候默认的就是gawk,gawk是awk的GNU版本。
其中command是真正的awk命令,-F表示域的分隔符,是个可选项。Filename是等待处理的文件
将所有的awk命令写入到一个文件,并使用该文件有X权限,然后awk命令解释器作为脚本的首行,也就是说可以把脚本最开始的 #!/bin/bash 换成 #!/bin/awk
最后直接执行这个脚本文件就行了。
-f 指定要加载的awk脚本,是一个文件。Filename是等待处理的文件
awk的工作流程是这样的:读入一行后(最后面带有” ”的),就按-F指定的分隔符来将该行划分成N个区域,$0表示所有的区域,$1表示第一个域,$2表示第二个域,依此类推,$n表示第n个域。
总结:awk先执行BEGIN内的命令,然后再读入文件中的行,接着就是按照指定的分隔符将该行分成N个区域,然后再来执行模式所对应的动作action。然后,再来读入第二行。。再重复执行action,直到所有的行都处理完成。最后再执行END中的命令。
注意:' // '之间是支持正则表达式的,如果此处只有pattern,而没有action,那么awk默认会把匹配到的行打印出来。
awk中的print还可以使用C语言中的printf来替代。在输出格式比较复杂的时候使用printf函数会比print函数要更直观一些,如下:
还可以使用-v key=value来自定义变量。如下:
awk中的条件语句是从C中借鉴过来的
语法:if (condition) {then-body} else {else-body}
例如使用awk来统计某个目录下的普通文件的大小,不包括子目录的,并过滤掉目录。
循环语句也和C中的一样,支持while、do/while、for、continue、break等关键字。
break和continue常用于循环中;
在awk中,数组的下标可以是数字或字母。一般awk中的数组的作用是从记录中收集信息,用于计算总和、统计单词等。
在awk中要删除一个元素的时候使用 delete array[index]
更多请参见awk官方文档[]