如何正确嵌套Bash反引号


91

我错过了一些反冲,或者反冲似乎不适用于过多的程序员引用循环。

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

hello1-hello2-hello3-echo hello4

通缉

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

该问题可能应该读为“如何递归使用Bash反引号”。那应该对那里的Google员工有所帮助。
乔伊·亚当斯

您正在尝试做什么?这根本没有任何意义。
ghostdog74 2010年

1
@joey,标题更改,非常受欢迎:D
Stormenet

1
糟糕!它应显示为“如何将反引号嵌套在bash中?” 。我搞混了递归和嵌套。
乔伊·亚当斯

deprecated因此,使用反引号$(cmd)
蒂莫

Answers:


144

$(commands)改为使用:

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

$(commands) 与反引号功能相同,但是您可以嵌套它们。

您可能也对Bash范围扩展感兴趣:

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

像{1..10}一样+1。用数组限制它?ZSH可以“ $ {$(date)[2,4]}”。为什么不这样:“ echo $ {echo hello1-$(echo hello2)[1]}”?
hhh 2010年

35

如果您坚持使用反引号,则可以执行以下操作

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

您必须将反斜杠放\\ \\\\ \\\\\\\\2倍,以此类推,反斜杠非常难看,请$(commands)按照其他建议使用。


11

每当您想评估命令时,请使用command substitution

$(command)

任何时候要计算一个算术表达式都可以使用expression substitution

$((expr))

您可以像这样嵌套这些:

假设file1.txt长30行,file2.txt长10行,那么您可以评估这样的表达式:

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

它将输出20(两个文件之间的行数之差)。


10

如果使用bash的$(cmd) 命令替换语法会更容易,它更易于嵌套:

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

5
这不限于bash。它适用于所有符合POSIX 1003.1的外壳(“ POSIX外壳”)和大多数Bourne派生的外壳(kshashdashbashzsh等),但不是实际的Bourne外壳(即heirloom.sourceforge.net) /sh.html)。
克里斯·约翰森

哇,此答案的时间戳与@joey_adams答案的时间戳相同!同步性的最字面意思是:)在这里也表示支持(:
drevicko,

0

有时反引号嵌套可以用xargs和管道代替

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

该解决方案的缺点是:

  • 必须以相反的顺序提供所有参数(4→1);
  • 所有参数都用空格分隔(可通过来解决tr):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4


让我们展示一个真实的用例。

以下命令在bash中有效,但在tcsh中无效(在tcsh中不能很好地处理反引号嵌套)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

它们可以替换为

$ which bash | xargs dirname | xargs ls
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.