我是 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),則傳回成功的退出代碼,設定為;否則傳回失敗的退出代碼,設定為。您可以輸入以下內容來查看:[
$#
-lt
2
]
$?
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
作為 的第一個操作數=
。[[
……]]
是一個外殼關鍵字(不是一個內建),具有特殊的解析規則來解決上述限制,並且可以提供附加功能。