Shell替换数组元素之间的间隔符号

Shell中的数组是这样表示的:

  arr=(1,2,3,4,5)

它们数组元素的间隔符号为逗号,如果我相把逗号替换为加号:

  echo ${arr//,/+}

输出:

  1+2+3+4+5

 

这个表达式是我在hackerrank上看到的。原题是,输入几个数字,然后求它们的平均数,以下是代码:

#!/bin/bash
# 输入几个数字并计算出平均值
# 第一个数字表示需要计算多少个数字
# 计算平均数的时候从第2位开始直到结束
# 如果输入
# 4
# 1
# 2
# 9
# 8
# 则结果为
# 5.000

read n
arr=($(cat))
arr=${arr[*]}
printf "%.3f" $(echo $((${arr// /+}))/$n | bc -l)

  

arr=($(cat)) 表示运行cat命令后,用户可以输入任意多个数字,这里的输入格式是:输入一个数字后按回车,然后输入第二个数字,直到输入4个数字,并按下Ctrl+D结束输入。

这样,arr会收到4个数字。表示为:arr=(1,2,9,8),它们之间用逗号分隔。

 

arr=${arr[*]}会将arr转为以空格分隔的数组 arr=(1 2 9 8),全文最核心的一句 $(echo $((${arr// /+}))/$n | bc -l) 意思是将arr数组转为以加号为间隔符的数组,展开后为:

  $(echo 1+2+9+8/4 | bc -l)

将这个算数表达式交给bc来计算,得出的结果为 3.750 。注意一下bc -l 参数,-l 表示使用数学库,它默认可以保持20位的精度。

 

最后修改:2018-01-27 10:29

 

posted @ 2018-01-27 01:01  ranwuer  阅读(600)  评论(0编辑  收藏  举报