このBASHコードを説明してください(1行)

このBASHコードを説明してください(1行)

BASH でこれが使用されているのをこれまで見たことがありません:

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

今まで見たことも使ったこともない部分がその${PIDFILE-部分です。

答え1

$PIDFILEが定義されている場合$PIDFILE、またはが未定義の/var/run/service.pid場合に使用することを意味します。$PIDFILE

新しいシェルから開始します。

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

次にPIDFILEを定義します。

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

それはBourne Shellの昔のものですsh マニュアルページ

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

すでに見たことがあるかもしれないもう 1 つの形式は です${parameter:-word}。 は と似ていますが、 がparameter空の文字列に設定されている場合の動作が異なります。

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

実証するには:

$ 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

${NULLVAR-default}が空の文字列に展開されることに注意してください。NULLVAR 定義されました。

詳しい説明については、「man bash」を実行して検索してください。パラメータ拡張「/Parameter Expansion」と入力します。

この説明では ${parameter-word} ビットは隠されています。

    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.

set と null に関する訂正をしてくれた Dennis に感謝します。

答え2

ミケル:

あなたが説明しているようにすべきではないでしょうか pidfile=${PIDFILE:-/var/run/service.pid}

関連情報