全力で怠けたい

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

シェルのあんまり使わないパラメータ展開のメモ。

シェルのあんまり使わないパラメータ展開のやり方のメモ。

わりとよく使うシェルのパラメータ展開は こっち

シェルのあんまり使わないパラメータ展開のメモ

シェルはパラメータ展開という機能があってシェルスクリプトを書くときはわりとよく使うけど、たまにしか使わなすぎて使い方をすぐに忘れるやつをメモしておく。 bash はこのページに書いてるのは基本的に動く。

${#パラメータ}: 文字列の長さを求める

${#パラメータ} はパラメータの文字列の長さを求めてその値に展開する。

${#パラメータ}bash は使えるけど sh だと使えたり使えなかったりするのと同じことは wc コマンドでできるのでほとんど使わないような気がする。

こんな感じに使う。マルチバイト文字の長さもちゃんと求められる。

$ (
  HOGE=hoge
  echo ${#HOGE}
  )
4

$ (
  HOGE=ほげ
  echo ${#HOGE}
)
2

wc コマンドを wc -m みたいに使うとこんな感じ。

$ (
HOGE=hoge
echo -n ${HOGE} | wc -m
)
       4

$ (
HOGE=ほげ
echo -n ${HOGE} | wc -m
)
       2

${パラメータ#パターン}: パラメータの値の先頭から パターン に一致する最短の部分を取り除く

${パラメータ#パターン} はパラメータの値の先頭から パターン に一致する最短の部分を取り除いてその値に展開する。

${パラメータ#パターン}bash は使えるけど sh だと使えたり使えなかったりするのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE#ho}"
)
ge

パターン はパス名展開の特殊文字が使える。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE#*.}"
)
tar.gz

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE}" | sed 's/^.*\.//'
)
gz

${パラメータ##パターン}: パラメータの値の先頭から パターン に一致する最長の部分を取り除く

${パラメータ##パターン} はパラメータの値の先頭から パターン に一致する最長の部分を取り除いてその値に展開する。

${パラメータ##パターン}bash は使えるけど sh だと使えたり使えなかったりするのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE##ho}"
)
ge

パターン はパス名展開の特殊文字が使える。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE##*.}"
)
gz

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE}" | sed 's/^.*\.//'
)
gz

${パラメータ%パターン}: パラメータの値の末尾から パターン に一致する最短の部分を取り除く

${パラメータ%パターン} はパラメータの値の末尾から パターン に一致する最短の部分を取り除いてその値の展開する。

${パラメータ%パターン}bash は使えるけど sh だと使えたり使えなかったりするのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE%ge}"
)
ho

パターン はパス名展開の特殊文字が使える。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE%.*}"
)
hoge.tar

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE}" | sed 's/\.[^.]*$//'
)
hoge.tar

${パラメータ%%パターン}: パラメータの値の末尾から パターン に一致する最長の部分を取り除く

${パラメータ%%パターン} はパラメータの値の末尾から パターン に一致する最長の部分を取り除いてそのその値の展開する。

${パラメータ%%パターン}bash は使えるけど sh だと使えたり使えなかったりするのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE%%ge}"
)
ho

パターン はパス名展開の特殊文字が使える。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE%%.*}"
)
hoge

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge.tar.gz
  echo "${HOGE}" | sed 's/\..*//'
)
hoge

${パラメータ:オフセット}: パラメータの値の先頭から オフセット 個の文字を取り除く

${パラメータ:オフセット} はパラメータの値の先頭から オフセット 個の文字を取り除いてその値に展開する。

${パラメータ:オフセット}bash は使えるけど sh だと使えないのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE:2}"
)
ge

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge
  echo "${HOGE}" | sed -E 's/^.{2}//'
)
ge

${パラメータ:オフセット:長さ}: : パラメータの値の先頭から オフセット 個の文字を取り除いてさらに最大で長さ個の文字列に展開する

${パラメータ:オフセット:長さ} はパラメータの値の先頭から オフセット 個の文字を取り除いてさらに最大で 長さ 個の文字列に展開する。

${パラメータ:オフセット:長さ}bash は使えるけど sh だと使えないのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE=hoge
  echo "${HOGE:2:1}"
)
g

sed コマンドを使うとこんな感じ。

$ (
  HOGE=hoge
  echo "${HOGE}" | sed -E -e 's/^.{2}//' -e 's/^(.{1}).*$/\1/'
)
g

${パラメータ/パターン/置換文字列}: パラメータの値の先頭から最初に パターン に一致する文字列の部分を 置換文字列 に置換する

${パラメータ/パターン/置換文字列} はパラメータの値の先頭から最初に パターン に一致する文字列の部分を 置換文字列 に置換してその値に展開する。 パターン はパス名展開の特殊文字が使える。

${パラメータ/パターン/置換文字列}bash は使えるけど sh だと使えないのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE="hoge hoge hoge"
  echo "${HOGE/hoge/fuga}"
)
fuga hoge hoge

sed コマンドを使うとこんな感じ。

$ (
  HOGE="hoge hoge hoge"
  echo "${HOGE}" | sed 's/hoge/fuga/'
)
fuga hoge hoge

${パラメータ//パターン/置換文字列}: パラメータの値の パターン に一致するすべての文字列の部分を 置換文字列 に置換する

${パラメータ/パターン//置換文字列} はパラメータの値の パターン に一致するすべての文字列の部分を 置換文字列 に置換してその値に展開する。 パターン はパス名展開の特殊文字が使える。

${パラメータ/パターン/置換文字列}bash は使えるけど sh だと使えないのと同じことは sed コマンドでできるのでほとんど使わないような気がする。

$ (
  HOGE="hoge hoge hoge"
  echo "${HOGE//hoge/fuga}"
)
fuga fuga fuga

sed コマンドを使うとこんな感じ。

$ (
  HOGE="hoge hoge hoge"
  echo "${HOGE}" | sed 's/hoge/fuga/g'
)
fuga fuga fuga

${!パラメータ}: パラメータの値をパラメータ名とみなしてさらにその値に展開する

${!パラメータ} はパラメータの値をパラメータ名とみなしてさらにその値に展開する。

${!パラメータ}bash は使えるけど sh だと使えない実装が多いのと同じことは eval コマンドでできるのでほとんど使わないような気がする。

$ (
  hoge=ほげ
  HOGE=hoge
  echo "${!HOGE}"
)
ほげ

eval コマンドを使うとこんな感じ。

$ (
  hoge=ほげ
  HOGE=hoge
  eval echo \"\$${HOGE}\"
)
ほげ