2013-09-30 65 views
9

這是什麼意思?在shell腳本表達式中,「plus colon」(「+:」)是什麼意思?

if ${ac_cv_lib_lept_pixCreate+:} false; then : 
    $as_echo_n "(cached) " >&6 
else 
    ac_check_lib_save_LIBS=$LIBS 

貌似ac_cv_lib_lept_pixCreate是一些變量,那麼,是什麼+:是什麼意思?

在哪裏可以學習大括號表達式的完整語法?這個語法的名字是什麼?

+0

這是一個冒號,而不是逗號。 – Marcin

+1

:是一個所謂的POSIX特別內置 –

+0

閱讀這裏爲:http://stackoverflow.com/questions/3224878/what-is-the-purpose-of-the-colon-gnu-bash-builtin AND http ://wiki.bash-hackers.org/syntax/pe – SriniV

回答

7

bash的shell參數擴展文檔是here。的+:沒有提及,但它確實提到:+

${parameter:+word}
如果參數爲null或取消,沒有被取代,否則字的擴張取代。

+1

前面的冒號是可選的,所以'$ {var +:}'意思是「如果'$ var'被設置爲任何東西,則替換冒號,否則不會替代。 。 – jthill

+6

不完全是可選的,但可以省略以提供稍微不同的含義。如果'var'未設置或爲空,'$ {var:+:}'擴展爲':'。僅當'var'未設置時,'$ {var +:}'才展開爲':',而不是它的值爲空值。 – chepner

+4

擴展運算符的無冒號版本通常用'忽略 '共同描述,冒號僅在描述運算符列表之前僅針對未設置的參數進行測試。 – chepner

2

簡單的例子將證明

我查了參數測試的存在,如果存在回聲「是」別的我回聲「否」

openvas:~$ ${TEST+:} false && echo "yes" || echo "no" 
no 
openvas:~$ TEST=1 
openvas:~$ ${TEST+:} false && echo "yes" || echo "no" 
yes 
openvas:~$ 

如果你看到,參數測試並且它實際上是未設置的,所以它返回false並退出路徑並進入或當我設置相同並再次測試時,它流向回聲部分(繼續& &),因爲它返回true

參見:thisthat

+1

從技術上講,第一個'TEST'未設置,不爲空。 – chepner

15

在「加冒號」 ${...+:}表達,只有+在外殼特殊的意義。在這種情況下,冒號只是一個字符串值,所以我們可以將該代碼段編寫爲${...+":"}

爲方便起見,我們假設該變量稱爲var,並考慮表達式:

if ${var+:} false; then ... 

如果shell變量$var存在,則整個表達式替換:,如果沒有,它返回一個空字符串。

因此,整個表達式${var+:} false變爲: false(返回true)或false(返回false)。

這歸結爲生存的考驗,即使變量沒有分配值可以爲true。

這是非常神祕的,但因爲它發生,對實際工作中大多數變量存在的幾個測試中的一個,如果不是所有的伯恩血統炮彈。

可能等同於:(此替換任何變量名var

if [[ ${var+"is_set"} == is_set ]]; then ... 

或者,可能更便於攜帶:

case ${var+"IS_SET"} in IS_SET) ...;; esac 
+2

如果你想知道,autoconf這樣做是因爲:並不是所有的shell都支持[[...]]'語法,而舊的'''''''''''''''''機制有一個令人頭痛的是跨越傳統Unix的變異性,並且可能不會內置(減慢速度),最後,方括號在字面上用於autoconf代碼是一種痛苦,因爲它們被重新用於M4引用。 – zwol

+0

@Zack - 好點 - 'autoconf'需要考慮所有可能的shell。我喜歡我自己的一些智能編碼,但是嘗試在函數中包裝特殊的構造來隔離和解釋它們的使用 - 對於這種情況不適用。 –

+0

@Zack - 更新了關於隱祕成語的部分。 –

4

爲了說明什麼已經說過:

取消設置變量(注意由於某些echo命令導致的空白行):

$ unset foo 
$ echo ${foo} 

$ echo ${foo:+:} 

$ echo ${foo+:} 

空變量:

$ foo="" 
$ echo ${foo} 

$ echo ${foo:+:} 

$ echo ${foo+:} 
: 

非空的變量:

$ foo="bar" 
$ echo ${foo} 
bar 
$ echo ${foo:+:} 
: 
$ echo ${foo+:} 
: 
相關問題