Унаследовать отступ при использовании функции cat в bash для печати нескольких строк - PullRequest
0 голосов
/ 02 марта 2020

В середине выполнения cat <<, если мы вызываем функцию bash, которая также использует cat <<, отступ наследуется только для первой строки.

Это лучше объяснить с помощью простой пример сценария:

#!/bin/bash

write_multiple_lines() {
    cat <<_EOF_
<h1>Header</h1>
<p>Paragraph</p>
_EOF_
    return
}

cat << _EOF_
<html>
    $(write_multiple_lines)
</html>
_EOF_

Результат выглядит следующим образом (<p> не следует за отступом <h1>).

<html>
    <h1>Header</h1>
<p>Paragraph</p>
</html>

, а желаемый результат -

<html>
    <h1>Header</h1>
    <p>Paragraph</p>
</html>

Я ожидал, что отступ будет наследоваться, если используется cat <<. Есть ли обходной путь для этого (кроме добавления вручную отступа к последующим строкам, как указано @bob dylan в комментарии)?

1 Ответ

4 голосов
/ 02 марта 2020

Единственный способ «сохранить» это изменить ваш входной файл. Причина, по которой <p> имеет отступ, заключается в том, что вы сделали отступ здесь:

$(write_multiple_lines)

Поскольку вы не хотите изменять свой ввод, например,

write_multiple_lines() {
    cat <<_EOF_
    <h1>Header</h1>
    <p>Paragraph</p>
_EOF_
    return
}

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

#!/bin/bash

write_multiple_lines() {
while read p; do
  echo "    " "$p"
done <<_EOF_
<h1>Header</h1>
<p>Paragraph</p>
_EOF_
return
}

cat << _EOF_
<html>
$(write_multiple_lines)
</html>
_EOF_

output:

<html>
     <h1>Header</h1>
     <p>Paragraph</p>
</html>

Хотя это менее динамично c / очевидно, тогда, если вы отформатировали его дословно, так что я придерживаюсь моего первоначального предложения, прежде чем делать что-то подобное.

...