重定向文本时缩进代码

use*_*974 4 bash

我想知道这个问题是否有解决方案.

在我的shell脚本中,我有一些代码将一些文本重定向到一个文件:

if [ condition ]; then
   cat > /outputfile <<EOF
text123
text345
text456
EOF
fi
Run Code Online (Sandbox Code Playgroud)

问题是我希望textxxx在我的代码中缩进,但是如果我这样做,那么重定向的文本中会有空格.

有没有办法可以很好地缩进代码并使输出文件没有空格.

use*_*058 5

使用

cat<<-EOF
   text123
EOF
Run Code Online (Sandbox Code Playgroud)

  • 请注意,"前导空格"必须是制表符. (3认同)

Jon*_*ler 3

标准答案是使用前导制表符(并且它们必须是制表符,而不是空格)和-“单词”之前:

cat <<-'EOF'
        Tab-indented text
    Blank-indented text
EOF
Run Code Online (Sandbox Code Playgroud)

(如果“制表符缩进”之前有一个或多个实际制表符)将输出:

Tab-indented text
    Blank-indented text
Run Code Online (Sandbox Code Playgroud)

如果这太不方便,那么一种替代方法是sed使用cat

sed 's/^[     ]*//' <<EOF
    Randomly
        Indented
  Text
EOF
Run Code Online (Sandbox Code Playgroud)

这将输出:

Randomly
Indented
Text
Run Code Online (Sandbox Code Playgroud)

(同样,您必须确保在正确的位置有制表符;这里,这意味着在命令的正则表达式中sed。或者sed 's/^[[:space:]]*//'如果您愿意,也可以使用。)

'EOF'请注意, vs的使用EOF会影响此处文档正文的解释(或不解释)。比较:

cat <<-EOF
        $(rm -fr *)  # Do not try this at home! (Or at work.)
        $HOME
EOF
Run Code Online (Sandbox Code Playgroud)

cat <<-'EOF'
        $(rm -fr *)
        $HOME
EOF
Run Code Online (Sandbox Code Playgroud)

第一个将使 shell 识别$(...)符号并执行命令并将输出(无内容)替换到此处的文档中。对您过去一两年所做的工作表示歉意!希望您有良好的备份。除了删除前导选项卡之外,第二个将逐字处理脚本的内容 - 这更安全,尽管任何类似的符号都不$(rm -fr *)是很安全!该变量$HOME将在第一个版本中扩展;第二次它将保持不变。