if 指令中的測試條件

if 指令中的測試條件

知道為什麼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 falseor if any_command, 其中[, true,falseany_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 STRINGis -nor -z。此語法測試是否STRING不為空。您的測試總是成功,因為既不是空字串,-n也不-z是空字串。

要使程式碼片段像[ -n STRING ]或 一樣工作[ -z STRING ],您需要雙引號該變數。外殼膨脹後[ -z "$rizwan" ],將恰好通過的論點[。它們將是-z變數的擴展值(即使它是空字串)和]。該工具將獲取您想要它獲取的所有參數。

如果$rizwan您的範例中未加引號的內容擴展為多個單詞,[則會得到三個以上的參數。一般來說,最終結果將取決於變數內容和 的實作[

比較為什麼我的 shell 腳本會因為空格或其他特殊字元而卡住?

Bash 中的註解[[有所不同。它是一個關鍵字,它與 shell 解析器集成,它改變了一些規則,它實際上知道[[和之間的變數和引號]]。如果您使用[[代替[(因此]]代替]),那麼您的程式碼將按您的預期工作。看這個答案

[是便攜式的。

答案2

由於變數rizwan為空,您的if命令變為:

if [ -n  ]

語法[ STRING ]測試字串是否為空(無字元)。因此,在您的情況下[ -n ],該字串-n顯然不是空的。

相關內容