web-dev-qa-db-ja.com

シェルスクリプトのドル括弧内のマイナス記号はどういう意味ですか?

既存のシェルスクリプトで、マイナス記号を含むか、またはマイナス記号で終わる参照されている変数がいくつかあります。例えば:

PID=${PID-/run/Unicorn.pid}

そして:

run_by_init() {
    ([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}

これらのシナリオの両方でマイナス記号はどういう意味ですか?

8
Matt Huggins

Bashのマニュアルページの「パラメータ拡張」のセクションによると、これは「パラメータが設定されていない場合はデフォルト値を使用する」ことを意味します。たとえば、

${PID-/run/Unicorn.pid}

$ PIDが設定されている場合は$ PIDに等しく、そうでない場合は/run/Unicorn.pidになります。

10
Andrew Schulman

これは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"
7
papo