知道為什麼echo
這兩種情況都執行語句嗎?
輸出it worked
:
#!/bin/bash
rizwan=''
if [ -n $rizwan ]; then
echo "it worked"
fi
替換-n
為,當期望沒有輸出時-z
它會輸出:it worked
#!/bin/bash
rizwan=''
if [ -z $rizwan ]; then
echo "it worked"
fi
答案1
您可能知道或不知道,但讓我們明確一下:[
不是語法的一部分if
。我的意思是if [ …
行為類似if true
, if false
or if any_command
, 其中[
, true
,false
和any_command
是命令。他們回到退出狀態,這才是重要的if
。
即使[
它是一個內建命令(並且它在 Bash 中),它的行為也像一個常規命令。甚至還有一個獨立的[
可執行檔(例如/usr/bin/[
),因為 POSIX 需要它。
這意味著[ -n whatever ]
只是一個[
帶有很少參數的命令。是的,]
只是一個參數,它不是分隔符號或類似的東西。指定的命令[
只需]
要是它的最後一個參數。這樣程式碼就更清晰易讀,]
沒有其他目的。
該命令test
相當於[
.唯一的差別是test
不需要]
。
[ -n whatever ]
相當於test -n whatever
.
如果 shell 擴展$rizwan
為空字串,則片段[ -n $rizwan ]
和分別[ -z $rizwan ]
變為[ -n ]
和[ -z ]
。該[
命令不知道-n
( 或-z
) 之間存在某些內容,並且]
在您的程式碼中,它只取得兩個參數。兩個測試都被視為[ STRING ]
語法 where STRING
is -n
or -z
。此語法測試是否STRING
不為空。您的測試總是成功,因為既不是空字串,-n
也不-z
是空字串。
要使程式碼片段像[ -n STRING ]
或 一樣工作[ -z STRING ]
,您需要雙引號該變數。外殼膨脹後[ -z "$rizwan" ]
,將恰好通過三的論點[
。它們將是-z
變數的擴展值(即使它是空字串)和]
。該工具將獲取您想要它獲取的所有參數。
如果$rizwan
您的範例中未加引號的內容擴展為多個單詞,[
則會得到三個以上的參數。一般來說,最終結果將取決於變數內容和 的實作[
。
比較為什麼我的 shell 腳本會因為空格或其他特殊字元而卡住?。
Bash 中的註解[[
有所不同。它是一個關鍵字,它與 shell 解析器集成,它改變了一些規則,它實際上知道[[
和之間的變數和引號]]
。如果您使用[[
代替[
(因此]]
代替]
),那麼您的程式碼將按您的預期工作。看這個答案。
[
是便攜式的。
答案2
由於變數rizwan
為空,您的if
命令變為:
if [ -n ]
語法[ STRING ]
測試字串是否為空(無字元)。因此,在您的情況下[ -n ]
,該字串-n
顯然不是空的。