你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

linux shell 数组——动态生成数组系列

[复制链接]
gaosmile 发布时间:2020-4-21 09:19
这篇文章主要讲是动态生成数组系列。方法应该很多,我这里主要以一个求和计算的题目为例进行分析。
6 D) x, K4 `+ M, ^& U. _- E8 Y

, W1 B! w; z# }+ U  v
题目:请用linux shell 写一段脚本,实现从1..1000中所有偶数的和值。
4 R) H- Q4 b. E  C+ O% F6 J% {
方法一:
4 V$ d9 |' s' T  D
通过while 循环得到需要的结果:
start=1;

4 H0 {9 @: L- o& Q% U( ~2 x# \" ]- m
total=0;
! H- b# J0 L* U
while [ $start -le 1000 ];do
  E7 r+ ]# ?, c6 c. ^* N" S% l9 x
    [[ $(($start%2)) == 0 ]]&&total=$(($total+$start));
$ C2 @8 W" E. D
   start=$(($start+1));
5 y1 E. ?# V, ~
done;
) s" h2 }9 s$ u3 n
echo $total;

! _( K/ N7 n- P, _/ Q
[chengmo@centos5 ~]$ start=1;total=0;while [ $start -
le 1000 ];do [[ $(($start%2)) == 0]]&&total=$(($total+$start)); start=$(($start+1));done;echo $total;
250500
( a& ]: _0 k% ^* i, F+ s0 v& s
以上运行结果是:249500,在linux shell 中,”;”作为命令行分隔符。如果大家对于$(()) 运算符号不是很理解,可以查看:linux shell 实现 四则运算(整数及浮点) 简单方法,如果对于:[[]] [] 符号,可以参考另外一篇文章linux shell 逻辑运算符、逻辑表达式详解。

1 i3 S% `/ P% I$ z
方法二:
3 w) H$ ?$ h# C% k( z( H
通过 for 循环得到结果:
- @2 m- }, Y' {. i0 }# ]6 _
start=0;
1 P4 C7 J( R& {  o
total=0;

/ a! s3 k8 b1 k. }8 T) g3 ~
for i in $(seq $start 2 1000); do

# W" u0 O. ]1 k
    total=$(($total+$i));
; \* t, W- x' w9 n
done;

; f1 e& P3 b$ T) g$ B2 H
echo $total;

# E$ C9 @; e& G# M: N  o$ r
[chengmo@centos5 ~]$ start=0;total=0;for i in $(seq $start 2 1000); do total=$(($total+$i));done;echo$total;
250500
+ k: w0 \3 [( X9 H3 T( V) A, C
上面语句已经代码方面明显优于方法一,而且性能方面表现也很好。下面比较就可以发现:
+ G: c' ?& C9 }+ ]7 U
比较性能:
: W* d' T9 T7 A5 L' t
[chengmo@centos5 ~]$ time (start=0;total=0;for i in $(seq $start 2 1000); dototal=$(($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

( r2 u4 T" g/ b7 }6 T/ T
方法一耗时 是方法二的 6倍!

+ I1 _$ }+ d% q; l6 K
seq 使用:
9 B2 z! }4 Q/ s* X
seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST

3 J$ M9 ^3 o, {% v( r5 Z, ^
[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

6 n& M! }. e. Q6 j1 m7 M3 J
说明:默认间隔是“空格” 如果想换成其它的可以带参数:-s
7 G+ N3 N" r/ ]3 [$ ^1 ~$ Y$ }  l* C
[chengmo@centos5 ~]$seq -s'#' 1 3 10
1#4#7#10

( W; c7 K3 c$ i. j* z, `
应用技巧:
  F# W: O& z5 J; E( x
生成连续数组系列:

6 P4 [# [" z2 V. S* P
[chengmo@centos5 ~]$ a=($(seq 1 3 10))
[chengmo@centos5 ~]$ echo ${a[1]}
4
[chengmo@centos5 ~]$ echo ${a[@]}
1 4 7 10

  Q# P4 D! P* Y1 R% W7 x8 j
生成连续相同字符:

. o% d( ?, N& {. e6 @8 @7 F: o% K
[chengmo@centos5 ~]$ seq -s '#' 30 | sed -e 's/[0-9]*//g'
#############################
5 W0 K- E4 m* Q8 A6 D
上面例子:通过加入间隔字符‘#’后,替换掉数字, 生成连续相同字符’#’,这个在以后书写中还是有不少帮助。

+ Z, l4 Q- m7 [, c$ ^
赞 收藏 评论0 发布时间:2020-4-21 09:19

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版