- シェルのパラメータ展開のメモ
- ${パラメータ:-値}: デフォルト値の指定 - 1
- ${パラメータ-値}: デフォルト値の指定 - 2
- ${パラメータ:=値}: デフォルト値を代入する - 1
- ${パラメータ=値}: デフォルト値を代入する - 2
- ${パラメータ:+値}: パラメータが指定されている場合は指定の値に展開する - 1
- ${パラメータ+値}: パラメータが指定されている場合のみ指定の値に展開する - 2
- ${パラメータ:?値}: パラメータ未設定時にエラーメッセージを出してシェルスクリプトを終了する - 1
- ${パラメータ?値}: パラメータ未設定時にエラーメッセージを出してシェルスクリプトを終了する - 2
シェルのパラメータ展開のやり方のメモ。
あまり使わないシェルのパラメータ展開は こっち。
シェルのパラメータ展開のメモ
シェルはパラメータ展開という機能があってシェルスクリプトを書くときはわりとよく使うので、わりとよく使うやつとあとそんなに使わないやつもメモしておく。 bash はこのページに書いてるのは基本的に動く。
${パラメータ:-値}: デフォルト値の指定 - 1
${パラメータ:-値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないかパラメータが空文字列のときは指定した 値 に展開する。
$ (
HOGE=hoge
echo "*${HOGE:-ほげ}*"
)
*hoge*
$ (
echo "*${HOGE:-ほげ}*"
)
*ほげ*
$ (
HOGE=
echo "*${HOGE:-ほげ}*"
)
*ほげ*
${パラメータ:-値} は if 文で記述するとこんな感じになる。
$ (
if [ -n "${HOGE}" ]; then
echo "*${HOGE}*"
else
echo "*ほげ*"
fi
)
*ほげ*
${パラメータ-値}: デフォルト値の指定 - 2
${パラメータ-値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないときは指定した 値 に展開する。
$ (
HOGE=hoge
echo "*${HOGE-ほげ}*"
)
*hoge*
$ (
echo "*${HOGE-ほげ}*"
)
*ほげ*
$ (
HOGE=
echo "*${HOGE-ほげ}*"
)
**
${パラメータ:=値}: デフォルト値を代入する - 1
${パラメータ:=値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないかパラメータが空文字列のときは指定した 値 がパラメータに代入してその値に展開する。
$ (
HOGE=hoge
: ${HOGE:=ほげ}
echo "*${HOGE}*"
)
*hoge*
$ (
: ${HOGE:=ほげ}
echo "*${HOGE}*"
)
*ほげ*
$ (
HOGE=
: ${HOGE:=ほげ}
echo "*${HOGE}*"
)
*ほげ*
${パラメータ:=値} は if 文で記述するとこんな感じになる。
$ (
if [ -z "${HOGE}" ]; then
HOGE="ほげ"
fi
echo "*${HOGE}*"
)
*ほげ*
${パラメータ=値}: デフォルト値を代入する - 2
${パラメータ=値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないときは指定した 値 がパラメータに代入してその値に展開する。
$ (
HOGE=hoge
: ${HOGE=ほげ}
echo "*${HOGE}*"
)
*hoge*
$ (
: ${HOGE=ほげ}
echo "*${HOGE}*"
)
*ほげ*
$ (
HOGE=
: ${HOGE=ほげ}
echo "*${HOGE}*"
)
**
${パラメータ:+値}: パラメータが指定されている場合は指定の値に展開する - 1
${パラメータ:+値} はパラメータが空文字列以外のときは指定した 値 に展開して、それ以外のときは空文字列に展開する。
パラメータにもともと設定している値は展開の結果には出てこない。
$ (
HOGE=hoge
HOGE_VALUE="${HOGE:+HOGE は値が設定されています}"
echo "*${HOGE_VALUE}*"
)
*HOGE は値が設定されています*
$ (
HOGE_VALUE="${HOGE:+HOGE は値が設定されています}"
echo "*${HOGE_VALUE}*"
)
**
${パラメータ:+値} の使いどころはあまりなさそうだけどパスを既存のパスに追加するようなときはこんな感じに使えて便利。
複数のパスを指定するときは : で区切るけど MY_PATH パラメータがすでに指定されているときは : に展開して MY_PATH パラメータが指定されていないときは : は展開しない、ということができる。
$ (
MY_PATH=/path/to/hoge
MY_PATH="/usr/local/myapp/bin${MY_PATH:+:}${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin:/path/to/hoge
$ (
MY_PATH="/usr/local/myapp/bin${MY_PATH:+:}${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin
${パラメータ:+値} は使わないで単純にこんな感じに書くと MY_PATH パラメータが指定されていないときに MY_PATH パラメータの右端に余分な : が付いちゃう。
$ (
MY_PATH="/usr/local/myapp/bin:${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin:
${パラメータ+値}: パラメータが指定されている場合のみ指定の値に展開する - 2
${パラメータ+値} はパラメータが指定されているときは指定した 値 に展開して、それ以外のときは空文字列に展開する。
パラメータにもともと設定している値は展開の結果には出てこない。
$ (
MY_PATH=/path/to/hoge
MY_PATH="/usr/local/myapp/bin${MY_PATH+:}${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin:/path/to/hoge
$ (
MY_PATH=
MY_PATH="/usr/local/myapp/bin${MY_PATH+:}${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin:
$ (
MY_PATH="/usr/local/myapp/bin${MY_PATH+:}${MY_PATH}"
echo "${MY_PATH}"
)
/usr/local/myapp/bin
${パラメータ:?値}: パラメータ未設定時にエラーメッセージを出してシェルスクリプトを終了する - 1
${パラメータ:-値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないかパラメータが空文字列のときは指定した 値 がエラーメッセージとして表示してシェルスクリプトが終了する。
シェルスクリプトじゃなくてシェル上から直接実行しているときはシェルは終了しない。
${パラメータ:-値} は必須パラメータのチェックとかに使ってる気がする。
$ (
MY_PATH=/usr/local/myapp/bin
echo "*${MY_PATH:?MY_PATH を指定してください}*"
)
*/usr/local/myapp/bin*
$ (
echo "*${MY_PATH:?MY_PATH を指定してください}*"
)
zsh: MY_PATH: MY_PATH を指定してください
$ (
MY_PATH=
echo "*${MY_PATH:?MY_PATH を指定してください}*"
)
zsh: MY_PATH: MY_PATH を指定してください
${パラメータ:?値} は if 文で記述するとこんな感じになる。
if [ -z "${MY_PATH}" ]; then
echo "MY_PATH を指定してください"
exit 1
fi
${パラメータ:?値} は 値 を省略するとシェルがデフォルトのエラーメッセージをこんな感じに表示する。
$ (
echo "*${MY_PATH:?}*"
)
zsh: MY_PATH: parameter not set
${パラメータ?値}: パラメータ未設定時にエラーメッセージを出してシェルスクリプトを終了する - 2
${パラメータ:-値} はパラメータが設定されているときはパラメータ自身の値に展開して、パラメータが設定されていないときは指定した 値 がエラーメッセージとして表示してシェルスクリプトが終了する。
$ (
MY_PATH=/usr/local/myapp/bin
echo "*${MY_PATH?MY_PATH を指定してください}*"
)
*/usr/local/myapp/bin*
$ (
echo "*${MY_PATH?MY_PATH を指定してください}*"
)
zsh: MY_PATH: MY_PATH を指定してください
$ (
MY_PATH=
echo "*${MY_PATH?MY_PATH を指定してください}*"
)
**