- シェルのあんまり使わないパラメータ展開のメモ
- ${#パラメータ}: 文字列の長さを求める
- ${パラメータ#パターン}: パラメータの値の先頭から パターン に一致する最短の部分を取り除く
- ${パラメータ##パターン}: パラメータの値の先頭から パターン に一致する最長の部分を取り除く
- ${パラメータ%パターン}: パラメータの値の末尾から パターン に一致する最短の部分を取り除く
- ${パラメータ%%パターン}: パラメータの値の末尾から パターン に一致する最長の部分を取り除く
- ${パラメータ:オフセット}: パラメータの値の先頭から オフセット 個の文字を取り除く
- ${パラメータ:オフセット:長さ}: : パラメータの値の先頭から オフセット 個の文字を取り除いてさらに最大で長さ個の文字列に展開する
- ${パラメータ/パターン/置換文字列}: パラメータの値の先頭から最初に パターン に一致する文字列の部分を 置換文字列 に置換する
- ${パラメータ//パターン/置換文字列}: パラメータの値の パターン に一致するすべての文字列の部分を 置換文字列 に置換する
- ${!パラメータ}: パラメータの値をパラメータ名とみなしてさらにその値に展開する
シェルのあんまり使わないパラメータ展開のやり方のメモ。
わりとよく使うシェルのパラメータ展開は こっち。
シェルのあんまり使わないパラメータ展開のメモ
シェルはパラメータ展開という機能があってシェルスクリプトを書くときはわりとよく使うけど、たまにしか使わなすぎて使い方をすぐに忘れるやつをメモしておく。 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}\" ) ほげ