[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo $a
1
 
一对括号表示是数组,数组元素用
空格
符号分割开。
 
2.
数组读取与赋值
得到长度:
[chengmo@centos5 ~]$ echo ${#a[@]}
5
${#
数组名
[@
*]}
可以得到数组长度
读取:
[chengmo@centos5 ~]$ echo ${a[2]} 
3
[chengmo@centos5 ~]$ echo ${a[*]} 
1 2 3 4 5   
${
数组名
[
下标
]}
下标是从
0
开始 
下标是:
*
或者
@
得到整个数组内容
赋值
:
[chengmo@centos5 ~]$ a[1]=100
[chengmo@centos5 ~]$ echo ${a[*]} 
1 100 3 4 5
 
[chengmo@centos5 ~]$ a[5]=100     
[chengmo@centos5 ~]$ echo ${a[*]}
1 100 3 4 5 100
直接通过
数组名
[
下标
]
就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
删除
:
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a
[chengmo@centos5 ~]$ echo ${a[*]}
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a[1]   
[chengmo@centos5 ~]$ echo ${a[*]} 
1 3 4 5
[chengmo@centos5 ~]$ echo ${#a[*]}
4
直接通过:
unset
数组
[
下标
]
可以清除相应的元素,不带下标,清除整个数据。
 
 
3.
特殊使用
分片
:
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo ${a[@]:0:3}
1 2 3
[chengmo@centos5 ~]$ echo ${a[@]:1:4}
2 3 4 5
[chengmo@centos5 ~]$ c=(${a[@]:1:4})
[chengmo@centos5 ~]$ echo ${#c[@]}
4
[chengmo@centos5 ~]$ echo ${c[*]} 
2 3 4 5
直接通过
${
数组名
[@
*]:
起始位置
:
长度
}
切片原先数组,返回是字符串,中间用
空格
分开,因此如果加上
”()”
,将得到切片数组,上面例子:
c
就是一个新数据。
替换
:
[chengmo@centos5 ~]$ a=(1 2 3 4 5)    
[chengmo@centos5 ~]$ echo ${a[@]/3/100}
1 2 100 4 5
[chengmo@centos5 ~]$ echo ${a[@]}
1 2 3 4 5
[chengmo@centos5 ~]$ a=(${a[@]/3/100}) 
[chengmo@centos5 ~]$ echo ${a[@]}     
1 2 100 4 5
调用方法是:
${
数组名
[@
*]/
查找字符
/
替换字符
}
该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
 
从上面讲到的,大家可以发现
linux shell
的数组已经很强大了,常见的操作已经绰绰有余了
linux shell
动态生成
数组系列
seq
使用技巧
2010-12-30 16:36:22
如果对
linux shell
数组不是很熟悉的话,请看上一篇文章:
  ,
 
题目:请用
linux shell
写一段脚本,实现从
1..1000
中所有偶数的和值。
 
方法一:
通过
while
循环得到需要的结果:
start=1;
total=0;
while [ $start -le 1000 ];do
    [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));
   start=$(($start+1));
done;
echo $total;
 
[chengmo@centos5 ~]$ start=1;total=0;while [ $start -le 1000 ];do    [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));   start=$(($start+1));done;echo $total;
250500
以上运行结果是:
249500,
linux shell
中,
”;”
作为命令行分隔符。如果大家对于
$(())
运算符号不是很理解,可以查看:
 
方法二:
通过
for
循环得到结果:
start=0;
total=0;
for i in $(seq $start 2 1000); do
    total=$(($total+$i));
done;
echo $total;
[chengmo@centos5 ~]$ start=0;total=0;for i in $(seq $start 2 1000); do    total=$(($total+$i));done;echo $total;        
250500
上面语句已经代码方面明显优于方法一,而且性能方面表现也很好。下面比较就可以发现:
比较性能:
[chengmo@centos5 ~]$ time (start=0;total=0;for i in $(seq $start 2 1000); do    total=$(($total+$i));done;echo $total;)              250500
real    0m0.016s
user    0m0.012s
sys     0m0.003s
[chengmo@centos5 ~]$ time (start=1;total=0;while [ $start -le 1000 ];do    [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));   start=$(($start+1));done;echo $total;) 
250500
real    0m0.073s
user    0m0.069s
sys     0m0.004s
方法一耗时
是方法二的
6
倍!
 
seq
使用:
seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
[chengmo@centos5 ~]$ seq 1000   ‘
起始默认是
1
,间隔默认也是
1
[chengmo@centos5 ~]$seq 2 1000  ‘
间隔默认是
1
[chengmo@centos5 ~]$seq 1 3 10    '
1
开始,到
10
间隔为
3
结果是:
1 4 7 10
说明:默认间隔是
空格
如果想换成其它的可以带参数:
-s
[chengmo@centos5 ~]$seq -s'#' 1 3 10
1#4#7#10
 
应用技巧:
 
生成连续数组系列:
[chengmo@centos5 ~]$ a=($(seq  1 3 10))    
[chengmo@centos5 ~]$ echo ${a[1]}
4
[chengmo@centos5 ~]$ echo ${a[@]}
1 4 7 10
生成连续相同字符:
[chengmo@centos5 ~]$ seq -s '#' 30 | sed -e 's/[0-9]*//g'
#############################
上面例子:通过加入间隔字符
后,替换掉数字, 生成连续相同字符
’#’
,这个在以后书写中还是有不少帮助。