既存のシェルスクリプトで、マイナス記号を含むか、またはマイナス記号で終わる参照されている変数がいくつかあります。例えば:
PID=${PID-/run/Unicorn.pid}
そして:
run_by_init() {
([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}
これらのシナリオの両方でマイナス記号はどういう意味ですか?
Bashのマニュアルページの「パラメータ拡張」のセクションによると、これは「パラメータが設定されていない場合はデフォルト値を使用する」ことを意味します。たとえば、
${PID-/run/Unicorn.pid}
$ PIDが設定されている場合は$ PIDに等しく、そうでない場合は/run/Unicorn.pidになります。
これはunset変数を意味することを強調する必要があります。空ではありません。
そして:-
と比較すると、変数がunsetまたはnull(空の文字列)。
コロンのないマイナスは(少なくとも私には)あまり見られず、:-
よりも具体的な用途があります GNUマニュアル にも言及されておらず、私のman bash
ですが、たとえば on tldp のように記述されています。
変数が適切な値を保持していない場合に、デフォルト値を置き換える必要がある場合。後者の方が適しています。
PID=${PID-/run/Unicorn.pid}
PIDが使用され、後でスクリプトでPID = ""を使用して空にされた可能性があります。この関連付けは失敗し、PIDは空の文字列 ""のままになります
PID=${PID:-/run/Unicorn.pid}
PIDは、設定されていない場合は「/run/Unicorn.pid」になりますが、以前はnull( "")であった場合でも同様です。
デフォルト値${previous-}
のない構成は、set -u
を持つ誰かに対する安全策であると議論されています
セット nounset
設定されていない変数や、特殊パラメーター ‘@’または ‘*’以外のパラメーターは、パラメーター展開を実行するときにエラーとして扱います。エラーメッセージが標準エラーに書き込まれ、非対話型シェルが終了します。
---(https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
set -u
[ "${previous}" ] || echo "This will fail"
[ "${previous-}" ] || echo "This works"