Пожалуйста, объясните этот код BASH (одна строка)

Пожалуйста, объясните этот код BASH (одна строка)

Никогда ранее не видел такого использования в 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.

Другая форма, которую вы, возможно, уже видели, — это ${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-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.

решение2

Микель:

Разве не должно быть так, pidfile=${PIDFILE:-/var/run/service.pid}как вы объясняете?

Связанный контент