4

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

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

if [ condition ]; then
   cat > /outputfile <<EOF
text123
text345
text456
EOF
fi

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

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

4

2 回答 2

5

利用

cat<<-EOF
   text123
EOF
于 2013-11-01T19:34:52.193 回答
2

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

cat <<-'EOF'
        Tab-indented text
    Blank-indented text
EOF

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

Tab-indented text
    Blank-indented text

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

sed 's/^[     ]*//' <<EOF
    Randomly
        Indented
  Text
EOF

这将输出:

Randomly
Indented
Text

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

请注意,'EOF'vs的使用EOF会影响(或不)解释 here 文档的正文的方式。相比:

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

cat <<-'EOF'
        $(rm -fr *)
        $HOME
EOF

第一个将让 shell 识别$(...)符号并执行命令并将输出(无)替换到此处的文档中。对你过去一两年所做的工作感到抱歉!希望你有很好的备份。第二个将逐字处理脚本的内容,而不是删除前导标签 - 这更安全,尽管像这样的任何符号$(rm -fr *)都不是很安全!该变量$HOME将在第一个版本中扩展;它将在第二个保持不变。

于 2013-11-01T20:06:22.053 回答