Как вы используете линии продолжения bash?
Я понимаю, что вы можете сделать это:
echo "continuation \
lines"
>continuation lines
Однако, если у вас есть код с отступом, он работает не так хорошо:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
источник
источник
Ответы:
Это то, что вы можете хотеть
Если это создает два аргумента для эха, и вы хотите только один, то давайте посмотрим на конкатенацию строк. В bash две строки расположены рядом друг с другом:
Таким образом, строка продолжения без отступа - это один из способов разбить строку:
Но когда используется отступ:
Вы получаете два аргумента, потому что это больше не конкатенация.
Если вам нужна одиночная строка, которая пересекает линии, при этом отступ, но не получая все эти пробелы, один из подходов, которые вы можете попробовать, - это исключить строку продолжения и использовать переменные:
Это позволит вам иметь чистый код с отступом за счет дополнительных переменных. Если вы сделаете переменные локальными, это не должно быть слишком плохо.
источник
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Здесь документы с
<<-HERE
разделителем работают хорошо для многострочных текстовых строк с отступом. Это удалит все ведущие вкладки из документа здесь. (Ограничители строки все равно останутся.)Смотрите также http://ss64.com/bash/syntax-here.html
Если вам нужно сохранить некоторые, но не все ведущие пробелы, вы можете использовать что-то вроде
или, возможно, использовать,
tr
чтобы избавиться от новых строк:(Во второй строке есть вкладка и пробел впереди; вкладка будет удалена оператором тире перед терминатором heredoc, тогда как пробел будет сохранен.)
Для наложения длинных сложных строк на несколько строк мне нравится
printf
:Это также хорошо работает в тех случаях, когда вы хотите встроить нетривиальные фрагменты сценария оболочки в другой язык, где синтаксис основного языка не позволяет использовать документ здесь, например, в
Makefile
илиDockerfile
.источник
printf
пример.)Вы можете использовать массивы bash
затем
есть дополнительное место, потому что (после руководства по bash):
Так что,
IFS=''
чтобы избавиться от лишнего пространстваисточник
В определенных сценариях использование способности конкатенации Bash может быть целесообразным.
Пример:
Из раздела ПАРАМЕТРЫ страницы Bash Man:
источник
Я столкнулся с ситуацией, когда мне приходилось отправлять длинное сообщение в качестве аргумента команды и придерживаться ограничения длины строки. Команды выглядят примерно так:
Я решил это, чтобы переместить сообщение как документ здесь (как предложено @tripleee). Но здесь документ становится стандартным, поэтому его нужно прочитать обратно, я использовал следующий подход:
Это имеет то преимущество, что
$message
может использоваться точно как строковая константа без лишних пробелов или разрывов строк.Обратите внимание, что фактические строки сообщения выше имеют префикс с
tab
символом, который удаляется самим документом (из-за использования<<-
). В конце все еще есть разрывы строк, которые затем заменяютсяdd
пробелами.Также обратите внимание, что если вы не удалите символы новой строки, они будут отображаться как есть, когда
"$message"
развернуты. В некоторых случаях вы можете обойти, удалив двойные кавычки$message
, но сообщение больше не будет единственным аргументом.источник
Продолжение строк также может быть достигнуто за счет умного использования синтаксиса.
В случае
echo
:В случае с Vars:
Другой подход в случае Vars:
Вуаля!
источник
Вы можете просто отделить его с помощью новых строк (без использования обратной косой черты), как требуется внутри отступа, как показано ниже, и просто удалить новые строки.
Пример:
Или, если это определение переменной, новые строки автоматически преобразуются в пробелы. Итак, лишние лишние пробелы только, если применимо.
источник
Это не совсем то, о чем просил пользователь, но еще один способ создать длинную строку, которая занимает несколько строк, - это постепенно наращивать ее, например, так:
Очевидно, что в этом случае было бы проще создать его за один раз, но этот стиль может быть очень легким и понятным при работе с более длинными строками.
источник
Попробуйте использовать одинарные кавычки и объединить строки:
Примечание: конкатенация включает пробелы.
источник
echo
если у васx=
, вы получите ошибку:lines: command not found
.В зависимости от того, какие риски вы принимаете и насколько хорошо вы знаете и доверяете данным, вы можете использовать упрощенную интерполяцию переменных.
источник
Это, вероятно, на самом деле не отвечает на ваш вопрос, но вы все равно можете найти его полезным.
Первая команда создает сценарий, который отображается второй командой.
Третья команда делает этот скрипт исполняемым.
Четвертая команда предоставляет пример использования.
Обратите внимание, что если вы действительно хотите использовать этот сценарий, имеет смысл переместить исполняемый сценарий
~/bin
так, чтобы он был на вашем пути.Проверьте Python ссылку для деталей о том, как
textwrap.dedent
работает.Если использование
$'...'
или"$(...)"
вас смущает, задайте другой вопрос (по одному на конструкцию), если его еще нет. Возможно, было бы неплохо предоставить ссылку на вопрос, который вы нашли / задали, чтобы другие люди имели связанную ссылку.источник