[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' #############################
上面例子:通过加入间隔字符 ‘ # ’ 后,替换掉数字, 生成连续相同字符 ’#’ ,这个在以后书写中还是有不少帮助。