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 ]進行呼叫。如果表達式計算結果為 true(即,如果腳本的參數數量小於 2),則傳回成功的退出代碼,設定為;否則傳回失敗的退出代碼,設定為。您可以輸入以下內容來查看:[$#-lt2]$?0$?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作為 的第一個操作數=

  • [[……]]是一個外殼關鍵字(不是一個內建),具有特殊的解析規則來解決上述限制,並且可以提供附加功能。

相關內容