2014-03-28 37 views
23

當我去回答this question時,我打算使用${}表示法,因爲我在這裏看過很多次,所以最好反引號。反撥與大括號在Bash

然而,當我試圖

joulesFinal=${echo $joules2 \* $cpu | bc} 

我得到的消息

-bash: ${echo $joules * $cpu | bc}: bad substitution 

joulesFinal=`echo $joules2 \* $cpu | bc` 

工作正常。那麼我需要做些什麼其他的改變?

+0

對於簡單的算術,只需使用Bash的內置設施即可。 'joulesFinal = $((joules2 * cpu))' – tripleee

+0

@tripleee原來的問題涉及到非整數運算,所以內建不起作用 – rojomoke

+0

分享到:0 [使用$()代替反引號的好處是什麼在shell腳本?](https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using-instead-of-backticks-in-shell-scripts)。 – codeforester

回答

36

當您使用${}(花括號)時,``被稱爲命令替換,相當於$()(括號)。

因此,這些都是相等並且表示「解釋置於其內的命令」:

joulesFinal=`echo $joules2 \* $cpu | bc` 
joulesFinal=$(echo $joules2 \* $cpu | bc) 
      ^      ^
     (instead of {   ) instead of } 

${}雖然表達式被用於變量替換。


man bash來自:

命令替換允許命令的輸出,以取代 命令名。有兩種形式:

  $(command) 
    or 
      `command` 

此外,``更難以處理,你不能嵌套的,例如。見下面的評論,也Why is $(...) preferred over ... (backticks)?

+5

您可能會補充說,棄用和$()是POSIX兼容的。 – hek2mgl

+0

是的,真的!剛剛更新,謝謝php @ hek2mgl :) – fedorqui

+0

我已經調查過了,我不得不承認,backtics確實與[POSIX]兼容(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ V3_chap02.html#tag_18_06_03)標準。然而,bash不贊成使用它們,並且'$()'更適合處理(+1) – hek2mgl

6

他們的行爲在特定情況略有不同:

$ echo "`echo \"test\" `" 
test 
$ echo "$(echo \"test\")" 
"test" 

所以反引號自動刪除雙引號。

+0

好點,有趣! – fedorqui

+0

有趣的例子。我懷疑$()的內容是在外部字符串處理特殊字符之前運行的,而不是使用反引號的情況。如果你想使用反引號並且引號持續存在,'echo'\''echo''test \\「\'」'將會起作用,因爲bash斜線轉義字符需要被轉義以進行外部字符串解析,以便持久化內部命令。 –