Dec
28
关于Bash中的数组,很多文章都已经介绍过。这里我也简单的写一下:
一、基础
Bash只是提供了一维数组,但没有上限的限制。
1)声明
# declare -a name
这样就声明了一个name数组。
2)赋值
给数组的赋值可以参考普通变量的定义,如:
另外,还可以对整个数组赋值:
数组元素之间以环境变量IFS的第一个字符来分割。即空格。
若要跨过分隔符,可以这样做:
3)引用
引用数组,需要使用如下的架构,不要缺少了{}号:
例如:
另外,还有两个特殊的符号,分别是*和@号,代指所有数组元素:
显示整个数组元素数量,则用:
4)注销
就当普通的变量,使用unset即可:
2、升级
明白了数组的定义和使用,就可以在bash里面方便的使用了。
假设,有如下的目录:
我现在要把这个目录下所有文件的文件名放到一个name数组中,方便在脚本里面使用。
上述的语句,其实就是使用了grep、awk、sed等把一列的字符转换为用()号包括,并用空格分开的字符串,这样就可以给filename数组赋值了。
基于同样的原理,如果我们希望把一个文件里面一列的字符串都赋值到一个数组里面的话,可以这样:
※2005-12-28 第一次编写
※原始编写文档
※参考资料
gzgzgz在ChinaUnix上的文章
一、基础
Bash只是提供了一维数组,但没有上限的限制。
1)声明
# declare -a name
这样就声明了一个name数组。
2)赋值
给数组的赋值可以参考普通变量的定义,如:
# name[0]=BeiJing
# name[1]=GuangZhou
# name[2]=ShenZhen
# name[1]=GuangZhou
# name[2]=ShenZhen
另外,还可以对整个数组赋值:
# name=([0]=BeiJing [1]=GuangZhou [2]=ShenZhen)
或
# name=(BeiJing GuangZhou ShenZhen)
或
# name=(BeiJing GuangZhou ShenZhen)
数组元素之间以环境变量IFS的第一个字符来分割。即空格。
若要跨过分隔符,可以这样做:
# name=("This is BeiJing" GuangZhou ShenZhen)
3)引用
引用数组,需要使用如下的架构,不要缺少了{}号:
引用
${name[subscript]}
例如:
# echo ${name[0]}
BeiJing
BeiJing
另外,还有两个特殊的符号,分别是*和@号,代指所有数组元素:
# echo ${name[ * ]} //*两边没有空格,这里如此表示是因为exblog会识别错误
BeiJing GuangZhou ShenZhen
# echo ${name[@]}
BeiJing GuangZhou ShenZhen
BeiJing GuangZhou ShenZhen
# echo ${name[@]}
BeiJing GuangZhou ShenZhen
显示整个数组元素数量,则用:
# echo ${#name[@]}
3
3
4)注销
就当普通的变量,使用unset即可:
# unset name
或
# unset name[0]
或
# unset name[0]
2、升级
明白了数组的定义和使用,就可以在bash里面方便的使用了。
假设,有如下的目录:
# ls -l
total 0
-rw-r--r-- 1 root wheel 0 Dec 28 11:39 001
-rw-r--r-- 1 root wheel 0 Dec 28 11:39 002
-rw-r--r-- 1 root wheel 0 Dec 28 17:49 003
-rw-r--r-- 1 root wheel 0 Dec 28 17:49 004
total 0
-rw-r--r-- 1 root wheel 0 Dec 28 11:39 001
-rw-r--r-- 1 root wheel 0 Dec 28 11:39 002
-rw-r--r-- 1 root wheel 0 Dec 28 17:49 003
-rw-r--r-- 1 root wheel 0 Dec 28 17:49 004
我现在要把这个目录下所有文件的文件名放到一个name数组中,方便在脚本里面使用。
# declare -a filename
# filename=(`ls -l|grep 00|awk '{print $9}'|sed -e :a -e '$!N;s/\\n/ /;ta'`)
# set|grep filename
filename=([0]="001" [1]="002" [2]="003" [3]="004")
# echo ${filename[@]}
001 002 003 004
# filename=(`ls -l|grep 00|awk '{print $9}'|sed -e :a -e '$!N;s/\\n/ /;ta'`)
# set|grep filename
filename=([0]="001" [1]="002" [2]="003" [3]="004")
# echo ${filename[@]}
001 002 003 004
上述的语句,其实就是使用了grep、awk、sed等把一列的字符转换为用()号包括,并用空格分开的字符串,这样就可以给filename数组赋值了。
基于同样的原理,如果我们希望把一个文件里面一列的字符串都赋值到一个数组里面的话,可以这样:
# cat test
test-001
test-002
test-003
test-004
# filename=(`cat test|sed -e :a -e '$!N;s/\\n/ /;ta'`)
# set|grep filename
filename=([0]="test-001" [1]="test-002" [2]="test-003" [3]="test-004")
test-001
test-002
test-003
test-004
# filename=(`cat test|sed -e :a -e '$!N;s/\\n/ /;ta'`)
# set|grep filename
filename=([0]="test-001" [1]="test-002" [2]="test-003" [3]="test-004")
※2005-12-28 第一次编写
※原始编写文档
※参考资料
gzgzgz在ChinaUnix上的文章
非常感谢,帮助很大。而且帖子说的非常条理清晰。
并且很感谢这个网站,不用注册也可以发表言论。呵呵。有时很想回帖感谢,不过又要注册先。再次谢谢。:)