2015-09-09 125 views
1

我對理解這一點非常困惑。我認爲,我可以寫出如下給出的返回碼比較。哪個更好?爲什麼要這樣呢?shell腳本比較

RC=$? 

if [[ $RC == '0' ]]; then 
if [ $RC -eq '0' ]; then 
if [ $RC == '0' ]; then 
if [ "$RC" == "0" ]; then 
if [ "$RC" -eq "0" ]; then 
if [[ "$RC" == "0" ]]; then 
if (("$RC" == "0")); then 
if ("$RC" == "0"); then 
if (($RC == 0)); then 
if ($RC == 0); then 

而一些更多...

如果RC="A" - 字符串?

+0

在unix中搜索stirng和數字比較以及在unix中使用c語法進行比較 –

回答

6

以上都不是。在絕大多數情況下,您希望直接從if內檢查退出代碼。它看起來像

command 
RC=$? 
if [ $RC == 0 ]; then 

任何代碼更優雅,強勁,地道書面

if command; then 

除非特別需要檢查的結果代碼的精確非零值。

要單獨提出有關要使用哪個比較運算符的問題,唯一完全便攜的變體是[=。這個傳統Bourne shell運算符的語法不支持==的相等性,所以這是錯誤的(儘管一些shell允許它作爲語法安全網)。 -eq運算符比較數字相等性,而=執行字符串比較。

在現代炮彈,[[((都是可行的,這取決於你是否更關心的字符串比較(這是[[有道理)或算術(這是((域 - 如果比較涉及一些非常有用實際的數字計算;但它絕對是更多的邊緣選擇,因爲它沒有用於字符串比較)。 [[也支持模式匹配,所以你不僅限於靜態字符串比較;與[不同,它需要字符串相等比較的雙等號。它圍繞着一些與[有關的棘手問題開展工作,包括但不限於正確的行爲,不帶引號的變量和以短劃線開頭的參數。

帶有一個括號的替代方法完全不符合您的要求。它試圖運行$RC作爲子shell中的命令。

+0

Upvoted - 感謝您的努力。如果它是一個字符串呢? – SriniV

+0

命令'$?'的返回值從不是一個字符串。你可以使用'if [$? 'eq 0]'這些情況。另一種可能性是跳過關鍵字「if」,但我更願意僅在少數情況下使用它:http:// unix。stackexchange.com/a/194926/57293 –

+0

很好的解釋。 – Umer

1

如果你在Bash它不分離它的變量,但是......一個returncode是一個數值,所以我會打賭:

rc=$? 

if ((! rc)); then 
    # rc == 0 
    Do something 
fi 

原因:保持連貫性與預期的type有關係。

檢查:http://tldp.org/LDP/abs/html/untyped.html

+0

你能解釋我爲什麼在(())上下注嗎?有什麼好處? – SriniV

+0

個人品味@realspirituals,在答案中解釋 – klashxx

+0

更新了問題。感謝迄今的努力 – SriniV