Вопрос

Либо я пропустил некоторую обратную связь, либо обратно, кажется, не работает с слишком большим количеством программистов-цитата.

$ 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

Другие советы

Если вы настаиваете в том, чтобы использовать BackTicks, можно сделать следующее

$ 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's $(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 (Backtick Necting не обрабатывается очень хорошо в TCSH)

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

Они могут быть заменены

$ which bash | xargs dirname | xargs ls
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top