Explique este código BASH (una línea)

Explique este código BASH (una línea)

Nunca antes había visto esto usado en BASH:

pidfile=${PIDFILE-/var/run/service.pid}

La parte que nunca he visto/usado antes es la ${PIDFILE-parte.

Respuesta1

Significa usar $PIDFILEsi $PIDFILEestá definido o /var/run/service.pidsi $PIDFILEno está definido.

Comenzando con un nuevo shell:

$ echo ${PIDFILE-/var/run/service.pid}
/var/run/service.pid

Ahora defina PIDFILE:

$ PIDFILE=/var/run/myprogram.pid
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/myprogram.pid

Es de los viejos tiempos de Bourne Shell.página de manual sh.

   ${parameter-word}
          If parameter is set then substitute its value;
          otherwise substitute word.

La otra forma que quizás ya hayas visto es ${parameter:-word}. Es similar, pero se comporta de manera diferente si parameterse establece en la cadena vacía.

   ${parameter:-word}
          Use Default Values.  If parameter is unset or null,
          the expansion of word is substituted.  Otherwise,
          the value of parameter is substituted.

Demostrar:

$ set | grep NOSUCHVAR    # produces no output because NOSUCHVAR is not defined
$ echo ${NOSUCHVAR-default}
default
$ echo ${NOSUCHVAR:-default}
default

$ NULLVAR=
$ set | grep NULLVAR      # produces output because NULLVAR is defined
NULLVAR=
$ echo ${NULLVAR-default}

$ echo ${NULLVAR:-default}
default

Observe cómo ${NULLVAR-default}se expande a la cadena vacía, porqueNULLVAR esdefinido.

Para obtener una explicación completa, ejecute "man bash" y busqueExpansión de parámetrosescribiendo "/Expansión de parámetros".

El bit ${parameter-word} está oculto en esta explicación:

    When  not  performing  substring  expansion, using the forms documented below,
    bash tests for a parameter that is unset or null.  Omitting the colon results
    in a test only for a parameter that is unset.

Gracias a Dennis por la corrección sobre conjunto versus nulo.

Respuesta2

Mikel:

¿No debería ser así pidfile=${PIDFILE:-/var/run/service.pid}como lo estás explicando?

información relacionada