【问题标题】:How to check for the existence of a second argument [duplicate]如何检查是否存在第二个参数[重复]
【发布时间】:2016-03-11 03:01:55
【问题描述】:

我需要更新这个我用 git 做事的 bash 函数:

push() {
  a=$1
  if [ $# -eq 0 ]
    then
      a=$(timestamp)
  fi
  # ... do stuff
}

但我不知道这条线是如何工作的

 if [ $# -eq 0 ]

我需要检查第一个参数,然后我需要检查第二个参数。

所以会有2个if语句。

我如何更新这个以及这条线是如何工作的

 if [ $# -eq 0 ]

【问题讨论】:

    标签: bash


    【解决方案1】:

    $# 部分是一个变量,其中包含传递给脚本的参数数量。

    那里的条件语句使用-eq 检查该变量的值,并检查该值是否为零(因为没有传递任何参数)。

    为了检查两个参数,您可以更改(或添加)该行,如下所示:

     if [ $# -eq 2 ]
    

    【讨论】:

      【解决方案2】:

      您可以创建一个小脚本来查看当您使用不同数量的参数调用函数时$# 的变化情况。例如:

      [“push.sh”的内容:]

      push() {
          echo $#
      }
      
      echo "First call, no arguments:"
      push
      echo "Second call, one argument:"
      push "First argument"
      echo "Third call, two arguments:"
      push "First argument" "And another one"
      

      如果你把它放在一个脚本中并运行它,你会看到类似的东西:

      -> % ./push.sh
      First call, no arguments:
      0
      Second call, one argument:
      1
      Third call, two arguments:
      2
      

      这告诉您$# 的值包含给函数的参数数量。

      您可以将if [ $# -eq 0 ] 部分添加到脚本中,并将0 更改为其他数字以查看会发生什么。此外,在互联网上搜索“bash if”将揭示-eq 部分的含义,并表明您也可以使用-lt-gt,例如,测试一个数字是小于还是大于另一个。

      最后,您可能希望使用类似以下的内容:

      a=$1
      b=$2
      
      if [ $# -lt 1 ]
      then
         a=$(timestamp)
      fi
      
      if [ $# -lt 2 ]
      then
          b=$(second thing)
      fi
      

      【讨论】:

      • 好吧,直到这篇文章我才意识到$# 是一个变量。为什么不像我见过的所有其他语言一样使用<>。为什么这种语言如此神秘?
      • <> 确实存在,但它们用于字符串比较(字典顺序)。我认为它们不同是因为字符串和数字在 bash 中不是“类型安全的”,所以 [[ 10
      • 例如在 JS 中你可以做 10 < 2"10" < "2" 。如果你有一个数字或一个字符串,你必须有一些方法告诉解释器。因此,引号说嘿......这是一个字符串。
      • 让操作员确定操作数是什么......至少可以说是荒谬的疯狂。
      • 这是看待它的一种方式。另一方面,必须在所有字符串参数(如文件名或命令行选项)周围加上引号会非常乏味。但我同意,这可能会令人困惑。
      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多