98

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

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

hello1-hello2-hello3-echo hello4

通缉

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

6 回答 6

161

改用$(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
于 2010-04-17T02:46:54.183 回答
38

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

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

你必须加上反斜杠,\\ \\\\ \\\\\\\\2x 等等,它只是非常难看,$(commands)按照其他建议使用。

于 2010-04-17T02:52:49.413 回答
12

任何时候你想评估一个命令使用command substitution

$(command)

任何时候你想计算一个算术表达式使用expression substitution

$((expr))

你可以像这样嵌套这些:

假设 file1.txt 有 30 行长,而 file2.txt 有 10 行长,那么您可以计算如下表达式:

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

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

于 2012-10-12T18:06:56.540 回答
10

如果使用 bash 的$(cmd) 命令替换语法会容易得多,这对嵌套更友好:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
于 2010-04-17T02:46:04.823 回答
2

有时反引号嵌套可以用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
于 2019-07-01T08:31:11.883 回答
0

您可以增量捕获并组合成一个变量

__=`printf hello2-`
__=`printf "${__}hello3-"`
__=`printf "${__}hello4-"`
printf "hello1-${__}"
于 2021-12-13T17:11:57.713 回答