Как правильно вложить Bash backticks - PullRequest
76 голосов
/ 17 апреля 2010

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

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

hello1-hello2-hello3-echo hello4

Требуются

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

Ответы [ 5 ]

124 голосов
/ 17 апреля 2010

Используйте $(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
31 голосов
/ 17 апреля 2010

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

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

Вы должны поставить обратную косую черту, \\ \\\\ \\\\\\\\ на 2x и т. Д., Это очень уродливо, используйте $(commands), как и предлагалось другим.

10 голосов
/ 12 октября 2012

Каждый раз, когда вы хотите оценить команду, используйте command substitution:

$(command)

В любое время, когда вы хотите оценить арифметическое выражение, используйте expression substitution:

$((expr))

Вы можете вложить их так:

Допустим, file1.txt имеет длину 30 строк, а file2.txt имеет длину 10 строк, чем вы можете оценить выражение следующим образом:

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

, который вывел бы 20 (разница в количестве строк между двумя файлами).

9 голосов
/ 17 апреля 2010

Намного проще, если вы используете bash $(cmd) синтаксис подстановки команд , который намного удобнее для вложенности:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
0 голосов
/ 01 июля 2019

Иногда вложенность обратного удара может быть заменена на xargs и трубы

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

Недостатком этого решения являются:

  • Все аргументы должны быть представлены в обратном порядке (4 & rightarrow; 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...