script example ejemplos bash syntax comments

example - bash script header



Comentando en un script Bash (6)

¿Cómo puedo comentar en cada línea de las siguientes líneas de un script?

cat ${MYSQLDUMP} | / sed ''1d'' | / tr ",;" "/n" | / sed -e ''s/[asbi]:[0-9]*[:]*//g'' -e ''/^[{}]/d'' -e ''s/""//g'' -e ''/^"{/d'' | / sed -n -e ''/^"/p'' -e ''/^print_value$/,/^option_id$/p'' | / sed -e ''/^option_id/d'' -e ''/^print_value/d'' -e ''s/^"/(.*/)"$//1/'' | / tr "/n" "," | / sed -e ''s/,/([0-9]*-[0-9]*-[0-9]*/)//n/1/g'' -e ''s/,$//'' | / sed -e ''s/^/"/g'' -e ''s/$/"/g'' -e ''s/,/","/g'' >> ${CSV}

Si intento agregar un comentario y digo " cat $ {MYSQLDUMP} | / #Output MYSQLDUMP File ", obtengo:

Eliminar: no encontrado

¿Es posible comentar aquí o no debido a " | / "?


$IFS comenta hacks

Este truco usa la expansión de parámetros en $IFS , que se usa para separar palabras en los comandos:

$ echo foo${IFS}bar foo bar

Similar:

$ echo foo${IFS#comment}bar foo bar

Usando esto, puedes poner un comentario en una línea de comando con contination:

$ echo foo${IFS# Comment here} / > bar foo bar

pero el comentario deberá estar antes de la / continuation.

Tenga en cuenta que la expansión de parámetros se realiza dentro del comentario:

$ ls file ls: cannot access ''file'': No such file or directory $ echo foo${IFS# This command will create file: $(touch file)}bar foo bar $ ls file file

Excepciones raras

El único caso raro que falla es si $IFS comenzó previamente con el texto exacto que se elimina a través de la expansión (es decir, después del carácter # ):

$ IFS=x $ echo foo${IFS#y}bar foo bar $ echo foo${IFS#x}bar foobar

Tenga en cuenta que el foobar final no tiene espacio, lo que ilustra el problema.

Como $IFS contiene solo espacios en blanco por defecto, es muy poco probable que se encuentre con este problema.

Crédito al comentario de @ pjh que desencadenó esta respuesta.


Aquí hay un script bash que combina las ideas y modismos de varios comentarios anteriores para proporcionar, con ejemplos, comentarios en línea con la forma general ${__+ <comment text>} .

En particular

  • <comment text> puede ser multilínea
  • <comment text> no se expandió por parámetro
  • no se generan subprocesos (por lo que los comentarios son eficientes)

Hay una restricción en el <comment text> , es decir, las llaves desbalanceadas ''}'' y paréntesis '')'' deben estar protegidas (es decir, ''/}'' y ''/)'' ).

Hay un requisito en el entorno de bash local:

  • el nombre del parámetro __ debe estar desarmado

Cualquier otro nombre de parámetro de bash sintácticamente válido servirá en lugar de __ , siempre que el nombre no tenga un valor establecido.

Un script de ejemplo sigue

# provide bash inline comments having the form # <code> ${__+ <comment>} <code> # <code> ${__+ <multiline # comment>} <code> # utility routines that obviate "useless use of cat" function bashcat { printf ''%s/n'' "$(</dev/stdin)"; } function scat { 1>&2 bashcat; exit 1; } # ensure that ''__'' is unset && remains unset [[ -z ${__+x} ]] && # if ''__'' is unset declare -r __ || # then ensure that ''__'' remains unset scat <<EOF # else exit with an error Error: the parameter __=''${__}'' is set, hence the comment-idiom ''/${__+ <comment text>}'' will fail EOF ${__+ (example of inline comments) ------------------------------------------------ the following inline comment-idiom is supported <code> ${__+ <comment>} <code> <code> ${__+ <multiline comment>} <code> (advisory) the parameter ''__'' must NOT be set; even the null declaration __='''' will fail (advisory) protect unbalanced delimiters /} and /) (advisory) NO parameter-expansion of <comment> (advisory) NO subprocesses are spawned (advisory) a functionally equivalent idiom is <code> `# <comment>` <code> <code> `# <multiline comment>` <code> however each comment spawns a bash subprocess that inelegantly requires ~1ms of computation ------------------------------------------------}


Como señaló DigitalRoss, la barra invertida final no es necesaria cuando la línea termina en | . Y puedes poner comentarios en una línea siguiendo a | :

cat ${MYSQLDUMP} | # Output MYSQLDUMP file sed ''1d'' | # skip the top line tr ",;" "/n" | sed -e ''s/[asbi]:[0-9]*[:]*//g'' -e ''/^[{}]/d'' -e ''s/""//g'' -e ''/^"{/d'' | sed -n -e ''/^"/p'' -e ''/^print_value$/,/^option_id$/p'' | sed -e ''/^option_id/d'' -e ''/^print_value/d'' -e ''s/^"/(.*/)"$//1/'' | tr "/n" "," | sed -e ''s/,/([0-9]*-[0-9]*-[0-9]*/)//n/1/g'' -e ''s/,$//'' | # hate phone numbers sed -e ''s/^/"/g'' -e ''s/$/"/g'' -e ''s/,/","/g'' >> ${CSV}


Esto tendrá algunos gastos generales, pero técnicamente responde a tu pregunta:

echo abc `#Put your comment here` / def `#Another chance for a comment` / xyz, etc.

Y específicamente para las tuberías, hay una solución limpia sin gastos generales:

echo abc | # Normal comment OK here tr a-z A-Z | # Another normal comment OK here sort | # The pipelines are automatically continued uniq # Final comment

Consulte Pregunta de desbordamiento de pila Cómo colocar un comentario de línea para un comando de multilínea .


La barra invertida final debe ser el último carácter en la línea para que se interprete como un comando de continuación. No se permiten comentarios o incluso espacios en blanco después de esto.

Deberías poder poner líneas de comentarios entre tus comandos

# output MYSQLDUMP file cat ${MYSQLDUMP} | / # simplify the line sed ''/created_at/d'' | / # create some newlines tr ",;" "/n" | / # use some sed magic sed -e ''s/[asbi]:[0-9]*[:]*//g'' -e ''/^[{}]/d'' -e ''s/""//g'' -e ''/^"{/d'' | / # more magic sed -n -e ''/^"/p'' -e ''/^print_value$/,/^option_id$/p'' | / # even more magic sed -e ''/^option_id/d'' -e ''/^print_value/d'' -e ''s/^"/(.*/)"$//1/'' | / tr "/n" "," | / # I hate phone numbers in my output sed -e ''s/,/([0-9]*-[0-9]*-[0-9]*/)//n/1/g'' -e ''s/,$//'' | / # one more sed call and then send it to the CSV file sed -e ''s/^/"/g'' -e ''s/$/"/g'' -e ''s/,/","/g'' >> ${CSV}


La barra invertida se escapa del #, interpretándolo como su carácter literal en lugar de un carácter de comentario.