以下兩個布爾表達式是否相同?什麼時候應該在布爾條件中用引號推變量?
if [ -n $1 ] ; then
if [ -n "$1" ] ; then
而這兩個
if [ $? == 0 ] ; then
if [ "$?" == 0 ] ; then
如果沒有 - 當你應該把在引號中的變量?
以下兩個布爾表達式是否相同?什麼時候應該在布爾條件中用引號推變量?
if [ -n $1 ] ; then
if [ -n "$1" ] ; then
而這兩個
if [ $? == 0 ] ; then
if [ "$?" == 0 ] ; then
如果沒有 - 當你應該把在引號中的變量?
當變量有可能包含空白時,或者通常不是連續的字符串時,將變量放在引號中。所以
因爲$?
應該始終是0到255之間的東西,你不需要引用,因爲它是在每個子流程返回後設置的返回值。這是不可能打破這種通過直接指定一個字符串值,即
$?=Is of course wrong and should be
?=Bad value assigment
,因爲用戶變量名必須用[A-ZA-Z_]開始,所以不要做;-)
而對於$ 1,如果值是一樣
myscript "arg1 with spaces"
測試
if [ -n $1 ] ; then
將炸燬過去了,
但測試
if [ -n "$1" ] ; then
會成功。
IHTH
它們並不總是相同的。如果所討論的變量爲空或包含空格,那麼[
命令(別名爲test
)可能會有太多或太多的參數。
在bash
中,可以使用內置的[[ -n $1 ]]
條件構造,它在評估條件之前不會將變量拆分爲單詞,這意味着不需要雙引號。
謝謝choroba,我試圖刪除我在askubuntu上提出的問題,你對此回答。 – user784637
在評估條件之前「不擴展變量」 - [bash手冊說明](http://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs)並不嚴格, :「對'[['和']]'之間的單詞不執行字分割和文件名擴展;執行波形擴展,參數和變量擴展,算術擴展,命令替換,過程替換和引用移除。 - 缺少分詞是這裏的關鍵。 –
@glennjackman:謝謝,修正。 – choroba
使用[
命令(是的,這是一個命令),你應該幾乎總是使用引號。例外情況非常罕見,我甚至可能不會進入它們。例如,
set -- 'x -a -z b'
if [ -n $1 ]; then echo foo; fi
# … crickets
if [ -n "$1" ]; then echo foo; fi
foo
猛砸也有[[
關鍵字(是的,這是一個關鍵字),這是足夠聰明,知道擴張和避免不引用的陷阱。 (但它仍然通常是安全的內[[
表達式引用。)
由於[
命令是符合POSIX標準和[[
是bashism,你決定什麼時候使用。
至於你的第二個例子,如果你正在比較某個數字,那麼使用==
就是一個bashism。如果你正在編寫的bash,使用算術表達式,如
if (($? == 0)); then …
但是,如果你想對符合POSIX,寫
if [ "$?" = 0 ]; then …
通常情況下,對$?
直接的比較是一個紅色的標誌,因爲比較成功/命令的失敗正是if
做:
if somecommand; then …
優於
somecommand
if (($? == 0)); then …
但是,如果你需要使用它,$?
是一個例外的東西,因爲它是保證永遠只能是一個單字節無符號整數,所以它是非常安全的使用未加引號的,雖然它不傷害報價。
$ false; if [ $? = 0 ]; then echo t; else echo f; fi
f
$ true; if [ $? = 0 ]; then echo t; else echo f; fi
t
$ false; if [ "$?" = 0 ]; then echo t; else echo f; fi
f
$ true; if [ "$?" = 0 ]; then echo t; else echo f; fi
t
$ false; if [ $? == 0 ]; then echo t; else echo f; fi
f
$ true; if [ $? == 0 ]; then echo t; else echo f; fi
t
$ false; if [ "$?" == 0 ]; then echo t; else echo f; fi
f
$ true; if [ "$?" == 0 ]; then echo t; else echo f; fi
t
實際上,當我引用'「$?」時,布爾表達式的計算方式與我不引用它時的計算方式不同...... – user784637
@ user784637我不知道該如何解釋。這似乎不可能,除非你的系統有什麼錯誤或者你誤解了結果。我在回答中發佈了一個演示。 – kojiro
看我的編輯 - 是我的示例程序不正確的語法? – user784637
謝謝 - 我想我現在明白了一點。是否有一個原因,爲什麼把''$?''引號引起布爾值以非預期的方式進行評估?就像我理解爲什麼將''1「'放在引號中是有用的,但是當我把''$?」'放在引號中時,它不起作用。 – user784637
查看修改。下面所有的好點。 +1給大家!我不確定你的意思是什麼「$?」不起作用。嘗試'set -vx;真實;如果[$? = 0];然後回聲傳遞;其他回聲失敗; fi;假; f [$? = 0];然後回聲傳遞;其他回聲失敗; fi;設置+ vx'來查看發生了什麼。在[''''和''[[....]]''中的各種組合中使用Sub。祝你們好運。 – shellter
@shelter:記住'[$? = 0]'是一個文本比較。算術比較可能是'(($?== 0))'(寒也是'[$?-eq 0]',但這太可怕了) – cdarke