2010-04-17 72 views
63

要麼我錯過了一些反彈或反彈似乎不適用於太多的程序員引用循環。如何正確嵌套Bash反引號

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``" 

hello1-hello2-hello3-echo hello4 

通緝

hello1-hello2-hello3-hello4-hello5-hello6-... 
+0

這個問題可能應該是「如何遞歸地使用Bash反引號」。這應該有助於Google員工在那裏。 – 2010-04-17 02:46:08

+0

你想要做什麼?這根本沒有意義。 – ghostdog74 2010-04-17 02:46:53

+1

@joey,標題改變了,歡迎光臨:D – Stormenet 2010-04-17 02:49:37

回答

103

使用$(commands)代替:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 

$(commands)與反引號的作用相同,但可以將它們嵌套。

您還可能有興趣在擊範圍擴展:

echo hello{1..10} 
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10 
+0

+1就像{1..10}。限制它與數組? ZSH可以「$ {$(date)[2,4]}」。爲什麼不:「echo $ {echo hello1 - $(echo hello2)[1]}」? – hhh 2010-04-17 11:03:49

7

如果你使用bash的$(cmd)command substitution syntax,這是更爲友好的嵌套這是一個容易得多:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 
+4

這不限於* bash *。它在所有符合POSIX 1003.1(「POSIX shells」)和大多數Bourne派生shell(* ksh *,* ash *,* dash *,* bash *,* zsh *等)的shell中都可用。實際的Bourne shell(即http://heirloom.sourceforge.net/sh.html)。 – 2010-04-17 03:02:56

22

,如果你堅持使用反引號,下面可以做

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``" 

你必須把反斜線,\\ \\\\ \\\\\\\\由2等它只是非常醜陋,使用其他建議使用$(commands)

+0

這實際上回答了這個問題 – Justas 2017-12-23 20:06:33

8

要評估一個命令使用command substitution任何時間:

$(command) 

要計算算術表達式中使用expression substitution任何時間:

$((expr)) 

您可以嵌套這些是這樣的:

讓我們假設file1.txt是30行長,file2.txt是10行長,比你可以這樣評估一個表達式:

$(($(wc -l file1.txt) - $(wc -l file2.txt))) 

這將輸出20(兩個文件之間的行數差異)。