Nunca vi isso usado antes no BASH:
pidfile=${PIDFILE-/var/run/service.pid}
A parte que nunca vi/usei antes é a ${PIDFILE-
parte.
Responder1
Significa usar $PIDFILE
se $PIDFILE
estiver definido ou /var/run/service.pid
se $PIDFILE
estiver indefinido.
Começando com um novo shell:
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/service.pid
Agora defina PIDFILE:
$ PIDFILE=/var/run/myprogram.pid
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/myprogram.pid
É dos velhos tempos de Bourne Shellsh página de manual.
${parameter-word}
If parameter is set then substitute its value;
otherwise substitute word.
A outra forma que você já deve ter visto é ${parameter:-word}
. É semelhante, mas se comporta de maneira diferente se parameter
estiver definido como uma string vazia.
${parameter:-word}
Use Default Values. If parameter is unset or null,
the expansion of word is substituted. Otherwise,
the value of parameter is substituted.
Para demonstrar:
$ 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 como ${NULLVAR-default}
se expande para a string vazia, porqueNULLVAR
édefiniram.
Para uma explicação completa, execute "man bash" e procure porExpansão de parâmetrosdigitando "/Expansão de parâmetro".
O bit ${parameter-word} está oculto nesta explicação:
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.
Obrigado a Dennis pela correção sobre set versus null.
Responder2
Mikel:
não deveria ser
pidfile=${PIDFILE:-/var/run/service.pid}
do jeito que você está explicando?