如何在bash中将参数设置为可选参数?

Modified on: Sat, 09 Jun 2018 10:14:23 +0800

在具有9个参数的以下函数中:

SUM() { 
    echo "The sum is $(($1+$2+$3+$4+$5+$6+$7+$8+$9))"
}

我想让下一个(3..9)的第二个参数成为可选参数

当我用2个参数调用该函数时,我得到错误:

SUM 3 8
bash: 3+8+++++++: syntax error: operand expected (error token is "+")

注意BOLD:第一个参数和第二个参数是强制参数,而不是函数的可选参数。我只希望第二个参数接下来是可选的,当我调用少于2个args的函数时,函数必须返回无结果。

作者:,αғsнιη

最佳答案

如果你不传递带空格的参数:

sum() {  
[[ -n $2 ]] && echo $(( $(tr ' ' '+' <<<"$@") ))
}

效果:

$ sum 1 2 3
6

说明:

  1. &lt;&lt;&lt;"some string"仅以"some string"作为输入。可以把它想象成echo "some string" |的简写。它被称为Here String。< / LI>
  2. "$@"扩展为所有位置参数,以空格分隔。它相当于"$1 $2 ..."
  3. 因此,tr ' ' '+' &lt;&lt;&lt;"$@"输出"$1+$2+$3...",评估由外部$(( ))
  4. [[ -n $2 ]]测试第二个参数是否为非空。您可以用[[ -n $2 ]] &amp;&amp;替换[[ -z $2 ]] ||
  5. 醇>

    另一种方式:

    sum() {
    [[ -n $2 ]] && (IFS=+; echo $(( $* )))
    }
    

    说明:

    1. $*就像$@一样,除了参数不是用空格分隔,而是用内部字段分隔符(IFS。使用IFS=+,它会扩展为“$ 1 + $ 2 + ...”。请参阅$ *和$ @之间有什么区别?
    2. 我们在子shell中设置IFS(注意周围的括号),这样主shell就不会受到影响。默认情况下,IFS是:\t\n(空格,制表符,换行符)。这是使用local变量的替代方法。
    3. 醇>

      现在回答你的问题:

      您可以对任何变量或参数使用默认值
      之一:

      SUM() { 
       echo "The sum is $(($1+$2+${3:-0}+${4:-0}+${5:-0}+${6:-0}+${7:-0}+${8:-0}+${9:-0}))" || false
      }
      

      或者:

      SUM() { 
       echo "The sum is $(($1+$2+${3:=0}+${4:=0}+${5:=0}+${6:=0}+${7:=0}+${8:=0}+${9:=0}))" || false
      }
      
作者:Community,muru

相关问答

添加新评论