Bitte erläutern Sie diesen BASH-Code (eine Zeile)

Bitte erläutern Sie diesen BASH-Code (eine Zeile)

Ich habe dies noch nie zuvor in BASH gesehen:

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

Das Teil habe ich noch nie zuvor gesehen/verwendet ${PIDFILE-.

Antwort1

Dies bedeutet, dass es zu verwenden ist , $PIDFILEwenn $PIDFILEes definiert ist, oder /var/run/service.pidwenn $PIDFILEes nicht definiert ist.

Beginnen mit einer neuen Shell:

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

Definieren Sie nun PIDFILE:

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

Es ist aus den alten Tagen der Bourne Shellsh-Manpage.

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

Die andere Form, die Sie vielleicht schon gesehen haben, ist ${parameter:-word}. Sie ist ähnlich, verhält sich aber anders, wenn parameterauf die leere Zeichenfolge gesetzt ist.

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

Demonstrieren:

$ 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

Beachten Sie, wie ${NULLVAR-default}sich zu einer leeren Zeichenfolge erweitert, dennNULLVAR Istdefiniert.

Für eine vollständige Erklärung führen Sie "man bash" aus und suchen Sie nachParametererweiterungindem Sie „/Parameter Expansion“ eingeben.

Das ${parameter-word}-Bit ist in dieser Erklärung versteckt:

    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.

Danke an Dennis für die Korrektur bezüglich Set versus Null.

Antwort2

Mikel:

sollte es nicht so sein, pidfile=${PIDFILE:-/var/run/service.pid}wie Sie es erklären?

verwandte Informationen