Как правильно вкладывать Баш обратные кавычки


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

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

hello1-hello2-hello3-echo hello4

хотел

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

4 ответа:

использовать $(commands) вместо:

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

$(commands) делает то же самое, что и backticks, но вы можете вложить их.

вы также можете быть заинтересованы в расширении диапазона 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 (разница в количестве строк между двумя файлами).

Это намного проще, если вы используете Баша $(cmd)синтаксис подстановки команд, что гораздо более дружелюбно к вложенности:

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