是否可以回显到文件中,但在 shell 脚本源中使用缩进?

是否可以回显到文件中,但在 shell 脚本源中使用缩进?

如果我有一些嵌套和缩进语句将多行字符串回显到文件中,则原始 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”与修饰符一起使用-。可以用制表符缩进。您必须从 切换echocat

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
}

相关内容