全力で怠けたい

怠けるために全力を尽くしたいブログ。

シェルのパラメータ展開のメモ。

シェルのパラメータ展開のやり方のメモ。

あまり使わないシェルのパラメータ展開は こっち

シェルのパラメータ展開のメモ

シェルはパラメータ展開という機能があってシェルスクリプトを書くときはわりとよく使うので、わりとよく使うやつとあとそんなに使わないやつもメモしておく。 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 を指定してください}*"
)
**