前回はパラメータ展開を学んだよ!
今回は
bash で拡張された
パラメータ展開を紹介するね!
Linux の標準的なシェルは
bash なので
ほとんど問題は起こらないだろうけど
他のシェルでは使えないかもしれないことは
覚えておこう!
${#変数名}
最初は「値の長さ」だよ
${#変数名}
このように書くと変数の値の文字列長を返すんだ簡単なので試してみよう!
MESSAGE=123456
echo "${#MESSAGE}"
へぇ…
6
6文字だから
6 なんだねwc の代わりに使えそう!${変数名:開始位置:長さ}今度は「値の部分展開」だよ
${変数名:開始位置:長さ}
${変数名:開始位置}
これは変数の値の一部分を抜き出すんだ開始位置は 0 から数え始めるから気をつけてね!例えば 「5文字目」となるよ!
4 は長さ の指定がなければ開始位置から末尾までを抜き出すよ負の長さを指定した場合は開始位置から「末尾から指定された文字数分まで」 を抜き出すんだ
言葉で言うと複雑な感じがするね
例を見てみよう!
VALUE=123456789
| コマンド | 出力 | 説明 |
|---|---|---|
echo "${VALUE:5}" | 6789 | 6文字目以降を抜き出す |
echo "${VALUE:3:3}" | 456 | 4文字目以降の3文字を抜き出す |
echo "${VALUE:6:-1}" | 78 | 7文字目以降末尾から1文字目までを抜き出す |
これは便利だね!
cut の代わりに使えそう!${変数名#文字列}次は「値の前方削除」だよ
${変数名#文字列}
${変数名##文字列}
これは変数の値の先頭から
文字列 にマッチする部分を削除した値を表示するよワイルドカードの指定も可能なんだ# の個数で2パターンあるんだね# だと最短一致パターン## だと最長一致パターンを削除してくれるよこれも例を見てみよう!
VALUE="/home/midori/diary.txt"
| コマンド | 出力 |
|---|---|
echo "${VALUE#/home}" | /midori/diary.txt |
echo "${VALUE#/*/}" | midori/diary.txt |
echo "${VALUE#*midori}" | /diary.txt |
echo "${VALUE#*.}" | txt |
echo "${VALUE##*/}" | diary.txt |
${VALUE##*/} はbasename の代わりに使えるね!${変数名%文字列}次は「値の後方削除」だよ
${変数名%文字列}
${変数名%%文字列}
これは変数の値の末尾から
文字列 にマッチする部分を削除した値を表示するよ${変数名#文字列} の同じく例を確認しよう!
VALUE="/home/midori/diary.txt"
| コマンド | 出力 |
|---|---|
echo "${VALUE%.txt}" | /home/midori/diary |
echo "${VALUE%/*}" | /home/midori |
echo "${VALUE%midori*}" | /home/ |
echo "${VALUE%%[!/]*}" | / |
${VALUE$/*} はdirname の代わりに使えるね!${変数名/置換前/置換後}次は「値の置換」だよ!
${変数名/置換前/置換後}
${変数名//置換前/置換後}
これは 「最初に現れる」ではなく 「全ての」
変数名 の値の最初に現れる 置換前 を置換後 に置き換えた値を表示するよ// を使うと置換前 を置換後 に置き換えてくれるんだこれも例を見てみよう
VALUE="/home/midori/diary.txt"
echo "${VALUE/midori/shigeru}"
/home/shigeru/diary.txt
それぞれ
sed の置換のg フラグありなしの動きになるんだね!${変数名^}, ${変数名,}, ${変数名~}最後は「大文字小文字の変換」だよ! 似たような機能なのでまとめて紹介するね
変数名 の値の小文字を大文字に変換した値を表示するよ^ は最初の1文字、^^ は全部を変換するんだ${変数名^}
${変数名^^}
変数名 の値の大文字を小文字に変換した値を表示するよ, は最初の1文字、,, は全部を変換するんだ${変数名,}
${変数名,,}
変数名 の値の大文字小文字を入れ替えた値を表示するよ~ は最初の1文字、~~ は全部を変換するんだ${変数名~}
${変数名~~}
tr の代わりに使えるね!今回は
bash 拡張のパラメータ展開を学んだよ!多くて一度で覚えきれないね…より便利に使えるように追加された記述なのでみどりが挙げてくれたようにコマンドで代用できる場合が多いよ
変数の値を細かく加工できて便利だけど急いで覚える必要はないと覚えておこう!