要么我错过了一些反冲,要么反冲似乎不适用于过多的程序员引用循环。
$ 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)
与反引号做同样的事情,但你可以嵌套它们。
您可能还对 Bash 范围扩展感兴趣:
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
如果您坚持使用反引号,则可以执行以下操作
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
你必须加上反斜杠,\\ \\\\ \\\\\\\\
2x 等等,它只是非常难看,$(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
该解决方案的缺点是:
所有参数都变成空格分隔(可以用 解决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
您可以增量捕获并组合成一个变量
__=`printf hello2-`
__=`printf "${__}hello3-"`
__=`printf "${__}hello4-"`
printf "hello1-${__}"