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