Est-il possible d'écho dans un file, mais utiliser indentation dans la source du script shell?

Si j'ai des instructions nestedes et indentées qui font écho à une string de plusieurs lignes dans un file, les indentations du shell d'origine (dans mon cas bash) seront rescopes dans le file cible.

Pour éviter cela, je supprime les indentations de la sortie écho, mais cela perd cette mise en forme de code indentée dans ma source, par exemple,

#! /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 } 

Je vise à get quelque chose aussi proche que possible de ceci:

 #! /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 } 

(Remarque: cette question a été listée comme un double possible d'une question liée à HEREDOC.Je ne sais pas où l'endroit correct pour répondre à ceci est donc je vais mettre ici pour le moment (quelqu'un s'il vous plaît laissez savoir si sinon). la question porte sur l'indentation des blocs de code, et l'heredoc n'est qu'une des nombreuses façons d'atteindre ce but et en fait HEREDOC n'était pas la solution avec laquelle je suis allé.)

Utiliser echo avec le commutateur -e (activer l'interprétation des barres obliques inversées):

 #!/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 } 

Vous pouvez utiliser un "ici-document" avec le - modificateur. Il peut être indenté par des caractères tabulaires. Vous devez passer de l' echo au cat .

 cat <<-EOF > /etc/apache/sites-availabe/000-default.conf <VirtualHost *:80> redirect 404 / ErrorDocument 404 </VirtualHost> EOF 

Ou, pour garder un œil sur le résultat, vous pouvez pré-traiter le document HERE en disant sed et indent avec 4 espaces à la place:

 sed 's/^ //' <<EOF ....{ ....(------)func () { ....(------)return ....(------)} ....} EOF 

J'ai utilisé . au lieu d'un espace et (------) au lieu d'un onglet pour montrer comment formater le script.

Quelques approches:

  •  printf '%s\n' > "$conf_file" \ '<VirtualHost *:80>' \ ' redirect 404 /' \ ' ErrorDocument 404' \ '</VirtualHost>' 

    Si vous souhaitez étendre les séquences d'échappement, remplacez %s par %b :

     printf '%b\n' > "$conf_file" \ '<VirtualHost *:80>' \ '\tredirect 404 /' \ '\tErrorDocument 404' \ '</VirtualHost>' 
  • @ cat <<- EOF de Choroba cat <<- EOF approche cat <<- EOF , mais l'indentation doit être faite avec des caractères TAB seulement et ils sont tous supprimés.

  •  ... indent=' '; cut -b "${#indent}-" << EOF > "$conf_file" <VirtualHost *:80> redirect 404 / ErrorDocument 404 </VirtualHost> EOF 

    (l'astuce étant d'avoir $indent retenez le nombre de caractères de retrait à couper (attention, cette mise à jour doit être faite avec des espaces, pas des tabulations)).

  •  ... cut -d'|' -f2- << EOF > "$conf_file" |echo "<VirtualHost *:80> | redirect 404 / | ErrorDocument 404 |</VirtualHost> EOF 

    Les séquences d'échappement ne seront pas développées, mais les variables et les substitutions de commands le seront. Citer EOF pour éviter cela ( cut... << 'EOF' par exemple).

  • Vous pouvez également ajuster l'indentation en fonction de celle de la première ligne:

     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