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

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

hello1-hello2-hello3-echo hello4

通缉

hello1-hello2-hello3-hello4-hello5-hello6-...
有帮助吗?

解决方案

使用$(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

其他提示

如果您坚持使用反引号,下面可以做

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

您必须通过2个放反斜杠,\\ \\\\ \\\\\\\\等等,它只是非常难看,使用$(commands)或其他建议。

要评估一个命令使用command substitution任何时间:

$(command)

要评估的算术表达式使用expression substitution任何时间:

$((expr))

您可以嵌套这些是这样的:

假设FILE1.TXT是长30行和FILE2.TXT是长10行,比你可以评估像这样的表达式:

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

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

这是一个容易得多,如果你使用bash的$(cmd) 命令替换语法,该更加友好的嵌套:

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

有时反引号嵌套可以替换为 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top