【问题标题】:Function argument used but not passed使用但未传递的函数参数
【发布时间】:2015-06-19 10:58:51
【问题描述】:

如果我定义一个接受参数的 bash(或任何其他 shell)函数,但在调用它时不传递参数,会发生什么?是否保证默认传递空字符串?

function test() {
  echo $1
}
test 

【问题讨论】:

    标签: bash


    【解决方案1】:

    查看http://tldp.org/LDP/abs/html/othertypesv.html#EX17

    如果脚本需要命令行参数,但在没有命令行参数的情况下调用,这可能会导致空变量赋值,通常是不希望的结果。防止这种情况的一种方法是使用预期的位置参数在赋值语句的两侧附加一个额外的字符。

    【讨论】:

    • Hihi :) 我从来不用在 bash 中处理超过 9 个参数。我将其编辑为 ${N} 简称,但后来我在文档中找到了上述语句。似乎是您问题的正确答案。
    • 答案是肯定的,就像使用任何其他未分配的变量扩展为空字符串一样。该声明正在讨论一个特定的“错误”,它可能因缺少参数而出现,并且是该问题的一个特别糟糕的“解决方案”(最后的“但是”注释要好得多)。
    • @EtanReisner 你是对的。我目前无法删除此答案,因为它已被接受-
    • 我已经好几年没看过“高级”指南了。 :-) 请注意,它错过了许多“最佳实践”,例如引用您的变量和验证您的输入。如今,像[ -n "${N}" ] 这样的用法被认为是安全的,至少在 bash 中是这样。因为[[[ 是bash 内置的,所以行为应该是一致的和可移植的。
    【解决方案2】:

    在这种情况下,$1unset。未使用的位置参数默认为unset,与设置为null 略有不同。如果你写了foo="",那么$foo 就是null

    其中一个区别是,如果您设置了nounset shell 属性 (set -o nounset),则引用 unset 参数将导致错误。

    更多信息:

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 2011-12-19
      • 2022-01-25
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多