linux循环数组
数组的赋值操作有问题,改成下面这样:
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
‘贰’ Linux awk 命令详解(二) if 分支 数组
一、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)脚本内容如下:
‘叁’ Linux Shell awk中怎么调用数组和for循环
echo|awk'
{
array[1]=1
array[2]=2
array[3]=3
array[4]=4
array[5]=5
for(i=1;i<=5;++i){
printarray[i]
}
}'
‘肆’ LINUX 脚本无法得到正确的结果 已经验证过文件读取到数组没有问题
#问题在于对于数组file_list的引用错误,修改如下:
#!/bin/sh
#
listname=$1
pathname=$2
#
k=0
whilereadLINE
do
file_list[$k]=$LINE
k=$k+1
done<$listname
cd$pathname
i=0
j=0
forLINEin"${file_list[@]}"#问题在于这里对数组的引用
do
FILE=`find.-name$LINE-print-quit`
if[-n"$FILE"];
then
a[$i]=$FILE
i=$i+1
else
b[$j]=$LINE
j=$j+1
fi
done
echo"foundfiles:"
foriin"${a[@]}";do
echo$i
done
echo"missingfiles:"
forjin"${b[@]}";do
echo$j
done
另外补充一点:
数组下标:最好不要使用k=$k+1表达,应该使用((k+1))或者k=`expr $k + 1`。因为,如果列表文件太多,会引起数组越界,超过系统允许数组下标的最大长度。
希望能够帮助到你,你的好评是我前进的动力,谢谢!
‘伍’ linux shell中数组循环取值和赋值的问题。
[seesea@UC ~]$ cat a.txt
1
2
3
4
a
b
c
d
[seesea@UC ~]$ ar=( $(cat a.txt) )
[seesea@UC ~]$ for (( i = 0; i < ${#ar[@]}; ++i )); do echo "ar[$i] = ${ar[i]}"; done
ar[0] = 1
ar[1] = 2
ar[2] = 3
ar[3] = 4
ar[4] = a
ar[5] = b
ar[6] = c
ar[7] = d
用数组更方便吧。
‘陆’ linux shell 命令定义和使用数组出错
实际上,bash中可以直接对数组赋值的,不需要使用declare。而且取长度的用法${#var}也只能是在bash中。
这些都不是符合POSIX标准的用法,而是bash所特有的。所以,要简单点的话,就将声明改为bash,即 #!/bin/bash。
当然,还有两处小错,要仔细点:
var =(1 2 3 3 5); #赋值时等号两边不能有空格
echo "${#var}; #引号不成对啊,这里也可以不要引号的
命令后面的分号其实也是多余的,只要换行了,分号就不需要(当然加了也没错)
‘柒’ linux脚本,在一个循环中赋值一个数组
1、if
[
-n
"$FILE"
];
then
如果$FILE非空,你赋给a[i]
2、如果$FILE为空,你给了b[i]一个空值,应该赋给$ubootfile吧
3、a[i]和b[i]的i值都没有递增,最终只能得到i默认值时的a和b吧
‘捌’ for(i=1;i<=31;a=i)//Linux中a=i不放就进入死循环,i值就出错,a只在这里出现 Fedora 15 gcc编译
楼上的对
我重写了代码,msys64 正确:
#include<stdio.h>
main()
{
enum weekday
{ sun,mon,tue,wed,thu,fri,sat} month[31],j,imasyuu;
int i,n;
imasyuu=sun;//imasyuu显示输出时起始位置为sunday
j=sun;//设定本月1号为星期几
printf("\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n","sun","mon","tue","wed","thu","fri","sat");
printf("\t");
n=0;//n,控制换行,n记录的是i日的星期
for(i=0;i<j;i++,n++)//跳过上月的空余
{
printf("\t");
}
for(i=1;i<=31;i++,n++)
{
if(n%7==0){printf("\n\t");n=0;}//判断是否换行。
printf("%d\t",i); //输出日期
}
printf("\n");
return 0;
}
//////////////////////另一种方法,没有写输出函数
enum weekday { sun,mon,tue,wed,thu,fri,sat} ;
int i,j,month[32] ; // i [1,31],month[i] 是i 天星期几
month[1]=mon;
j=month;
for(i=1;i<32;i++)
{
month[i]=j;
j++;
if(j==7)j=imasyuu;
}
‘玖’ Linux Shell 下有3个数组 A(a b c) B(1 2 3) C(x y z) 现在想打印出数组D ("A[]"_"B[]"_"C[]")
很简单啊……
#!/bin/bash
a=(a b c)
b=(1 2 3)
c=(x y z)
h=0
for ((i=0; i < 3; i++)); do
for ((j=0; j < 3; j++)); do
for ((k=0; k < 3; k++)); do
echo "d[$h] = ${a[$i]}_${b[$j]}_${c[$k]}"
let h++
done
done
done
输出结果如下:
d[0] = a_1_x
d[1] = a_1_y
d[2] = a_1_z
d[3] = a_2_x
d[4] = a_2_y
d[5] = a_2_z
d[6] = a_3_x
d[7] = a_3_y
d[8] = a_3_z
d[9] = b_1_x
d[10] = b_1_y
d[11] = b_1_z
d[12] = b_2_x
d[13] = b_2_y
d[14] = b_2_z
d[15] = b_3_x
d[16] = b_3_y
d[17] = b_3_z
d[18] = c_1_x
d[19] = c_1_y
d[20] = c_1_z
d[21] = c_2_x
d[22] = c_2_y
d[23] = c_2_z
d[24] = c_3_x
d[25] = c_3_y
d[26] = c_3_z
‘拾’ linux shell脚本中,数组名称是一个变量,怎么打印出它里面的元素
题主你好,
代码及测试截图如下:
希望可以帮到题主, 欢迎追问.