重定向文本时缩进代码

时间:2013-11-01 19:32:02

标签: bash

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

使用

cat<<-EOF
   text123
EOF

答案 1 :(得分:2)

标准答案是使用前导标签(它们必须是标签,而不是空白)和-之前的'word':

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

其中(如果在'Tab-indented'之前有一个或多个实际标签)将输出:

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会影响此处文档的正文是如何解释的。比较:

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

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

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