-1

我有一个脚本,用户可以在其中添加任意数量的参数(数字)。

该脚本将对最后一个数字旁边的所有数字求和 - 最后一个数字(参数)是我需要除以的数字

例如:

./test.sh 2 2 6 5

这将对前 3 个数字 (2+2+6) 求和,然后将答案除以 5(最后一个参数)

  1. 如何使用最后一个参数?回声???
  2. 我如何移动循环除最后一个参数之外的第一个参数 - 我希望所有 3 个参数都将添加到一个数组中,我可以循环它
  3. 请注意,参数的数量可以更改
4

3 回答 3

0

如何使用最后一个参数?回声???

当然$# > 0,您可以使用"${!#}".

我如何移动循环除最后一个参数之外的第一个参数 - 我希望所有 3 个参数都将添加到一个数组中,我可以循环它

再次授予$# > 0,可以参考"${@:1:$# - 1}"

阅读 bash 手册中的数组部分,了解如何正确扩展数组。

我还建议学习引用的工作原理并了解不必要的分词和通配符的危险。

于 2021-12-25T10:11:22.230 回答
0

有大约一千种方法可以做到这一点。由于您想使用整数运算,您可以在 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} ))

将所有项相加并随后减去最后一项更容易

于 2021-12-25T16:14:22.210 回答
0

很快(带有bashisms

由于这个问题被标记为

这是一个小而有效的脚本:

#!/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")
    
于 2021-12-25T09:23:46.840 回答