2010-02-19 11 views
5

¿Cuál es la sangría apropiada para un script bash? Como mono java/C++, sangré religiosamente mi código. Pero parece que no se le permite sangra el siguiente código:¿Cuál es la sangría apropiada para los scripts bash?

#! /bin/bash 

if [ $# = 0 ] 
then 
     # there was no arguments => just do to standard output. 
     echo "there are no parameters" 
else 
cat << EOF 
========================================================== 
========================================================== 
========================================================== 
========================================================== 
DESCRIPTION: 

$1 
---------------------------------------------------------- 

EOF 
fi 

Cuando sangría que no reconoce el EOF y si sólo sin sangrar el EOF (confundir) se imprime con sangría.

Q: ¿Cuál es la sangría correcta para los scripts bash?

+0

La mayoría de los lenguajes de programación que cuentan con heredocs tienen problemas sangría ellos. Esto no es realmente específico para bash. –

Respuesta

18

Con bash (3.2 como mínimo) y ksh (no sé de otros) puede aplicar sangría a los documentos aquí usando <<-, y las pestañas iniciales se quitarán (no espacios, solo pestañas), p.

if [...]; then 
    cat <<-EOF 
     some text 
    EOF 
fi 
+2

Otra cosa que es útil saber es que al citar el delimitador inicial se impide la expansión (parámetro, sustitución de comando, etc.) del documento aquí: 'foo << "EOF" 'y se pueden combinar:' foo << - "EOF" '. Este último es útil para comentar bloques de código (puede usar '' no-op 'como el comando de recepción u omitirlo). Además, al usar '<< -' puede elegir si desea aplicar sangría al delimitador de cierre (o cualquier línea, en realidad). –

+0

Ver mi comentario en la otra respuesta, no se puede sangrar el marcador final del documento aquí. – haridsv

+0

funciona en 'dash' también. –

2

Esto no es un problema de sangría bash, este es un problema de archivo aquí. La etiqueta que especifique después de <<, es decir, EOF, debe aparecer sola en una línea, sin espacios en blanco iniciales o finales.

Para el archivo heredado, se usa como tipeado, con sangría incluida.

+0

there _is_ a solution ('<< -'), ver otras respuestas –

-1

Mouviciel es correcto.

Puede poner el texto aquí-archivo en un archivo separado si desea conservar la sangría. Sin embargo, usted tendría que manejar la sustitución usted mismo.

4

sí se puede "guión", mediante el uso de <<- (ver página del manual de bash en los documentos aquí)

if [ $# = 0 ] 
then 
     # there was no arguments => just do to standard output. 
     echo "there are no parameters" 
else 
    cat <<-EOF 
    ========================================================== 
    ========================================================== 
    ========================================================== 
    ========================================================== 
    DESCRIPTION: 

    $1 
    ---------------------------------------------------------- 
    EOF 
fi 
+0

+1. ¡No sabía esa característica! – mouviciel

+1

Esto es ligeramente incorrecto, el marcador final del documento aquí todavía no puede sangrarse. De hecho, esta es mi mayor queja acerca de los documentos aquí, que solo quitan las pestañas iniciales (me gustaría 2 espacios como sangría), y que aún no se puede sangrar el marcador final. – haridsv

+1

@haridsv en realidad usted ** puede ** sangrar el marcador final en 'GNU bash 4.3.11' y' dash 0.5.7' –

Cuestiones relacionadas