if [ $# -lt 2 ] 是什么意思?

if [ $# -lt 2 ] 是什么意思?

我是 Unix/Linux 新手。我正在尝试理解在我之前开发人员的代码。有人能告诉我这一行是什么if [ $# -lt 2 ]意思吗?

答案1

在 Bash 中$#扩展到已设置的位置参数的数量。

if [ $a -lt $b ]表示如果 a 的值小于 b 的值。

if [ $# -lt 2 ]意思是如果设置的位置参数数量小于2。

在一个实际示例中,你也许会使用它来计算函数的参数数量。如果你将函数定义为:

count_words(){
  if [ $# -lt 2 ]
  then
    echo "There are less than two words."
  else
    echo "There are 2 or more words."
  fi
}

然后使用不同的单词数调用该函数,结果如下:

$ count_words hello
There are less than two words.

$ count_words how many words
There are two or more words.

$ count_words
There are less than two words.

$ count_words two words
There are two or more words.

答案2

这是由三部分组成的:

  • $#是一个 shell 变量,包含脚本或函数的位置参数的数量。

  • [不是特殊语法,而是程序的名称 - 它是 的别名test。(查看man [man test。)

    的命令行[被解析为一个表达式:[ $# -lt 2 ]正在[使用参数$#-lt2](这只是一个视觉分隔符)进行调用。它返回一个成功的退出代码,$?如果0表达式计算结果为真(即,如果脚本的参数数量小于 2),则设置为 ,否则返回失败的退出代码,设置$?1。您可以通过输入以下内容来查看:

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
    
  • if condition; then body; fi评估命令condition,如果它返回成功的退出代码,则继续评估中的命令body

值得注意的是您可能会遇到的一些事情:

  • true实用程序始终返回成功的退出代码,并且false始终返回失败,因此您可以在条件下使用它们,例如:

    while true; do
    done
    
  • if [ $foo = "yes" ]$foo如果扩展为空字符串 ( [ = yes ]) 或包含空格的字符串 ( ) ,则不起作用[ no thanks = yes ]。因此您经常会看到:

    if [ "x$foo" = "xyes" ]
    

    因此,它[接收单个参数xno thanks作为的第一个操作数=

  • [[]]是一个 shell关键词(不是内置),并使用特殊的解析规则来解决上述限制,并且可能提供额外的功能。

相关内容