2012-08-30 22 views

回答

8

當變量有可能包含空白時,或者通常不是連續的字符串時,將變量放在引號中。所以

因爲$?應該始終是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

+0

謝謝 - 我想我現在明白了一點。是否有一個原因,爲什麼把''$?''引號引起布爾值以非預期的方式進行評估?就像我理解爲什麼將''1「'放在引號中是有用的,但是當我把''$?」'放在引號中時,它不起作用。 – user784637

+0

查看修改。下面所有的好點。 +1給大家!我不確定你的意思是什麼「$?」不起作用。嘗試'set -vx;真實;如果[$? = 0];然後回聲傳遞;其他回聲失敗; fi;假; f [$? = 0];然後回聲傳遞;其他回聲失敗; fi;設置+ vx'來查看發生了什麼。在[''''和''[[....]]''中的各種組合中使用Sub。祝你們好運。 – shellter

+0

@shelter:記住'[$? = 0]'是一個文本比較。算術比較可能是'(($?== 0))'(寒也是'[$?-eq 0]',但這太可怕了) – cdarke

4

它們並不總是相同的。如果所討論的變量爲空或包含空格,那麼[命令(別名爲test)可能會有太多或太多的參數。

bash中,可以使用內置的[[ -n $1 ]]條件構造,它在評估條件之前不會將變量拆分爲單詞,這意味着不需要雙引號。

+0

謝謝choroba,我試圖刪除我在askubuntu上提出的問題,你對此回答。 – user784637

+0

在評估條件之前「不擴展變量」 - [bash手冊說明](http://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs)並不嚴格, :「對'[['和']]'之間的單詞不執行字分割和文件名擴展;執行波形擴展,參數和變量擴展,算術擴展,命令替換,過程替換和引用移除。 - 缺少分詞是這裏的關鍵。 –

+0

@glennjackman:謝謝,修正。 – choroba

8

使用[命令(是的,這是一個命令),你應該幾乎總是使用引號。例外情況非常罕見,我甚至可能不會進入它們。例如,

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 
+0

實際上,當我引用'「$?」時,布爾表達式的計算方式與我不引用它時的計算方式不同...... – user784637

+0

@ user784637我不知道該如何解釋。這似乎不可能,除非你的系統有什麼錯誤或者你誤解了結果。我在回答中發佈了一個演示。 – kojiro

+0

看我的編輯 - 是我的示例程序不正確的語法? – user784637

相關問題