我有一个脚本,用户可以在其中添加任意数量的参数(数字)。
该脚本将对最后一个数字旁边的所有数字求和 - 最后一个数字(参数)是我需要除以的数字
例如:
./test.sh 2 2 6 5
这将对前 3 个数字 (2+2+6) 求和,然后将答案除以 5(最后一个参数)
- 如何使用最后一个参数?回声???
- 我如何移动循环除最后一个参数之外的第一个参数 - 我希望所有 3 个参数都将添加到一个数组中,我可以循环它
- 请注意,参数的数量可以更改
我有一个脚本,用户可以在其中添加任意数量的参数(数字)。
该脚本将对最后一个数字旁边的所有数字求和 - 最后一个数字(参数)是我需要除以的数字
例如:
./test.sh 2 2 6 5
这将对前 3 个数字 (2+2+6) 求和,然后将答案除以 5(最后一个参数)
如何使用最后一个参数?回声???
当然$# > 0
,您可以使用"${!#}"
.
我如何移动循环除最后一个参数之外的第一个参数 - 我希望所有 3 个参数都将添加到一个数组中,我可以循环它
再次授予$# > 0
,可以参考"${@:1:$# - 1}"
。
阅读 bash 手册中的数组部分,了解如何正确扩展数组。
我还建议学习引用的工作原理并了解不必要的分词和通配符的危险。
有大约一千种方法可以做到这一点。由于您想使用整数运算,您可以在 bash 中执行以下操作
一个简短的半隐秘版本是:
IFS=+
echo $(( ( ${*} - ${#:-1} ) / ${#:-1} ))
这里我们利用 和 之间的差异"${*}"
通过"${#}"
设置来进行求和IFS=+
(参见What is the difference between "$@" and "$*" in Bash?)
一个长期的经典方法是:
for i in "$@"; do ((s+=i)); done
echo $(( (s-${@:-1})/${@:-1} ))
将所有项相加并随后减去最后一项更容易
由于这个问题被标记为integer-arithmetic和bash:
这是一个小而有效的脚本:
#!/bin/bash
addVals=${*: 1 : $# - 1}
declare -i intResult=" ( ${addVals// /+} ) / ${@: -1} "
echo $intResult
但是没有循环...
如何使用最后一个参数?回声???
您可以在命令行中进行尝试:
set -- 2 2 6 5
然后
echo $@
2 2 6 5
echo ${*: 3}
6 5
echo ${*: -1}
5
echo ${*: 1 : -1}
bash: -1: substring expression < 0
echo $#
4
echo ${*: 1 : $# -1}
2 2 6
那好吧
someVar=${*: 1 : $# -1}
echo ${someVar// /:SpaceReplacment:}
2:SpaceReplacment:2:SpaceReplacment:6
所以
declare -i result
result=" ( ${someVar// /+} ) / ${*: -1} "
echo $result
2
我如何移动循环除最后一个参数之外的第一个参数 - 我希望所有 3 个参数都将添加到一个数组中,我可以循环它
仍在前进,在命令行下...
someArray=("${@: 1: $# -1 }")
用于declare -p
显示$someArray
的内容:
declare -p someArray
declare -a someArray=([0]="2" [1]="2" [2]="6")
然后
declare -i mySum=0
for i in "${someArray[@]}";do
mySum+=i
done
echo $mySum
10
echo $(( mySum / ${*: -1} ))
2
请注意,参数的数量可以更改
请注意:
使用双引号可以处理包含空格的字符串:
set -- foo bar 'foo bar baz'
echo ${2}
bar
echo ${*: $# }
foo bar baz
使用“$@”(数组到数组)和“$*”(数组到字符串)的区别
set -- foo bar 'foo bar' 'foo bar baz'
如果我采用 3 个第一要素:
someArray=("${@: 1: $# -1 }")
declare -p someArray
declare -a someArray=([0]="foo" [1]="bar" [2]="foo bar")
但
someArray=("${*: 1: $# -1 }")
declare -p someArray
declare -a someArray=([0]="foo bar foo bar")