在 bash 函数中使用 cat 打印多行时继承缩进

Inherit indentation when using cat in bash function to print multiple lines

在执行 cat << 的过程中,如果我们调用也使用 cat << 的 bash 函数,缩进仅在第一行继承。

使用简单的示例脚本可以更好地解释这一点:

#!/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 在评论中指出的手动向后续行添加缩进之外)?

'preserve' 的唯一方法是更改​​您的输入文件。 <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_

输出:

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

虽然这不太动态/明显,但如果你逐字格式化,所以在做这样的事情之前我会坚持我最初的建议。