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.