如果我有一些嵌套和缩进语句将多行字符串回显到文件中,则原始 shell(在我的例子中是 bash)中的缩进将被转移到目标文件中。
为了避免这种情况,我从回显的输出中删除了缩进,但这会丢失源代码中的缩进代码格式,例如,
#! /bin/bash
function configure_default_vhost() {
case "$2" in
[--production])
echo "<VirtualHost *:80>
# These lines are "breaking" out of the preffered indenting
redirect 404 /
ErrorDocument 404
</VirtualHost>
" > /etc/apache/sites-availabe/000-default.conf
esac
}
我的目标是得到尽可能接近的东西:
#! /bin/bash
function configure_default_vhost() {
case "$2" in
[--production])
echo "<VirtualHost *:80>
# These lines are aligned with the preffered indenting
redirect 404 /
ErrorDocument 404
</VirtualHost>
" > /etc/apache/sites-availabe/000-default.conf
esac
}
(注意:这个问题已被列为可能与 HEREDOC 相关问题重复。我不确定回答这个问题的正确位置在哪里,所以我现在放在这里(如果不是的话,请告知)。我的问题是关于缩进代码块,heredoc 只是实现此目的的众多方法之一,实际上 HEREDOC 并不是我采用的解决方案。)
答案1
您可以将“here-document”与修饰符一起使用-
。可以用制表符缩进。您必须从 切换echo
到cat
。
cat <<-EOF > /etc/apache/sites-availabe/000-default.conf
<VirtualHost *:80>
redirect 404 /
ErrorDocument 404
</VirtualHost>
EOF
或者,要在结果中保留制表符,您可以预处理 HERE 文档,例如sed
并缩进 4 个空格:
sed 's/^ //' <<EOF
....{
....(------)func () {
....(------)return
....(------)}
....}
EOF
我使用.
空格和制表符来代替空格和(------)
制表符来显示如何格式化脚本。
答案2
几种方法:
printf '%s\n' > "$conf_file" \ '<VirtualHost *:80>' \ ' redirect 404 /' \ ' ErrorDocument 404' \ '</VirtualHost>'
如果您希望扩展转义序列,请替换
%s
为%b
:printf '%b\n' > "$conf_file" \ '<VirtualHost *:80>' \ '\tredirect 404 /' \ '\tErrorDocument 404' \ '</VirtualHost>'
@choroba 的
cat <<- EOF
方法,但缩进必须仅使用制表符完成,并且它们都被删除。... indent=' '; cut -b "${#indent}-" << EOF > "$conf_file" <VirtualHost *:80> redirect 404 / ErrorDocument 404 </VirtualHost> EOF
(技巧是保存
$indent
要修剪的缩进字符数(注意这次,缩进必须使用空格字符,而不是制表符))。... cut -d'|' -f2- << EOF > "$conf_file" |echo "<VirtualHost *:80> | redirect 404 / | ErrorDocument 404 |</VirtualHost> EOF
转义序列不会扩展,但变量和命令替换会扩展。引用
EOF
以防止这种情况(cut... << 'EOF'
例如)。您还可以根据第一行的缩进来修剪:
show() { expand | awk 'NR == 1 {match($0, /^ */); l = RLENGTH + 1} {print substr($0, l)}' } ... show << EOF > "$conf_file" <VirtualHost *:80> redirect 404 / ErrorDocument 404 </VirtualHost> EOF
答案3
echo
与开关一起使用-e
(启用反斜杠转义的解释):
#!/bin/bash
function configure_default_vhost() {
conf_file="/etc/apache/sites-availabe/000-default.conf"
case "$2" in
[--production])
# The ">" overwrites; the ">>" appends.
{
echo -e "<VirtualHost *:80>"
echo -e "\tredirect 404 /"
echo -e "\tErrorDocument 404"
echo -e "</VirtualHost>"
} > "$conf_file"
esac
}