2010-08-07 111 views
7

在各種指南和腳本中,我遇到過人們傾向於使用if語句的不同語法。有什麼區別,什麼是最佳實踐?我相信所有以下陳述和更多變體將返回true:bash/sh if語句語法

bar="foo" 
if [ "foo" = "foo" ] 
if [[ "foo" == $bar ]] 
if [ "foo" = "$bar" ] 
if [[ "foo" = "$bar" ]] 
if [[ "foo" -eq $bar ]] 
+1

[bash:雙重或單個括號,圓括號,花括號]的可能重複(http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) – 2010-08-07 13:09:56

+0

閱讀http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls – Philipp 2010-08-07 14:01:38

回答

5

據我瞭解

=預計串

當量預計整數

「$酒吧」 是字面匹配,即Z *可擴展,而是 「Z *」 將逐字匹配通配符字符。

[]和[[]]之間的區別是在後面的單詞分割和路徑名稱擴展沒有完成,但在前者。

加[[]]允許附加運算符:

& &(AND), || (OR), >(字符串1詞法比String2的更大), <(字符串1詞法比String2的以下)

的==比較運算符行爲不同的雙括號內測試比單括號內。

[[$ a == z *]]#如果$ a以「z」(模式匹配)開頭,則爲真。

[[$ a ==「z *」]]#如果$ a等於z *(文字匹配),則爲真。

[$ a == z *]#發生文件匹配和分詞。

[「$ a」==「z *」]#如果$ a等於z *(文字匹配),則爲真。

退房http://tldp.org/LDP/abs/html/comparison-ops.html更多信息

+0

小修正/澄清:'='和'=='同樣的事情(即它們都在'[[]]'中進行模式匹配),除了某些'['不支持'=='的實現。基本上,使用'=='的唯一原因是它對其他語言很熟悉。另外,'''不支持字符串與'<' and '>'比較,你只需要轉義它們,否則它們將被解析爲I/O重定向:'[string1 \ 2010-08-08 04:38:28

2

我推薦case/esac。

case "$foo" in 
    "bar") echo "bar";; 
    *) echo "not equal";; 
esac 

對於不同的語法沒有煩惱。

3

[是一個bash內建命令,[[是一個bash關鍵字。如果腳本不必與其他shell兼容(例如,如果它以#!/bin/bash開頭),並且僅將[用於與Bourne shell的兼容性,則最佳做法是始終使用[[。請參閱http://mywiki.wooledge.org/BashFAQ/031