【问题标题】:In bash how to use the last argument- and adding all other arguments to array在 bash 如何使用最后一个参数 - 并将所有其他参数添加到数组
【发布时间】:2022-01-25 10:23:52
【问题描述】:

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

脚本会将最后一个数字旁边的所有数字相加 - 最后一个数字(参数)是我需要除以的数字

例如:

./test.sh 2 2 6 5

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

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

【问题讨论】:

  • 你尝试了什么?
  • this answer 是否涵盖了您正在尝试做的事情?
  • 回声 $@| awk '{ 总和 = 0; for(i=1;i

标签: bash sum integer-arithmetic positional-parameter


【解决方案1】:

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

授予$# > 0,您可以使用"${!#}"

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

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

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

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

【讨论】:

    【解决方案2】:

    很快(使用 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")
      

    【讨论】:

      【解决方案3】:

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

      将所有项相加然后减去最后一项会更容易

      【讨论】:

        猜你喜欢
        • 2013-12-14
        • 2013-04-12
        • 1970-01-01
        • 2020-03-30
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        相关资源
        最近更新 更多