カテゴリー
【シェルの文字列操作のショートハンド集】Bashの文字列のパラメーター拡張のアレコレ
※ 当ページには【広告/PR】を含む場合があります。
2021/03/29
はじめに
文字列の置換
利用法①:
#最初にマッチした箇所のみ置換
${変数名/パターン/置換}
利用法②:
#マッチした全ての箇所を置換
${変数名//パターン/置換}
使用例
$ HOGE_FILE="/path/to/hoge.piyo.fuga.mofu"
$ echo "${HOGE_FILE/./-}"
#👇先頭から最初に見つかった.を-で置換
/path/to/hoge-piyo.fuga.mofu
$ echo "${HOGE_FILE//./-}"
#👇先頭から見つかった.を全て-で置換
/path/to/hoge-piyo-fuga-mofu
文字列の(前方・後方一致部分の)置換
利用法①:
#前からマッチした箇所を置換
${変数名/#パターン/置換}
利用法②:
#後ろからマッチした箇所を置換
${変数名/%パターン/置換}
使用例
$ HOGE_FILE="/path/to/hoge.piyo.fuga.mofu"
$ echo "${HOGE_FILE/#\/path/-}"
#👇先頭から完全に一致した/pathまでを-で置換
-/to/hoge.piyo.fuga.mofu
$ echo "${HOGE_FILE/#path/-}"
#👇先頭から完全に一致していないので置換は行われない
/path/to/hoge.piyo.fuga.mofu
$ echo "${HOGE_FILE/%a.mofu/-}"
#👇末尾から完全に一致したa.mofuまでを-で置換
/path/to/hoge.piyo.fug-
$ echo ${HOGE_FILE/%a.mof/-}
#👇後ろからの検索パターンが一致しなければ置換は実行されないので注意
/path/to/hoge.piyo.fuga.mofu
$ BROS=(太郎 次郎 三郎)
$ echo "${BROS[@]/#/甘}"
#👇先頭に'甘'という文字を追加
甘太郎 甘次郎 甘三郎
文字列の長さをカウント
利用法:
${#変数}
使用例
$ GREETING="本日から本気出す。"
$ echo ${#GREETING}
#👇日本語も正しくカウントされる
9
部分文字列
利用法①:
#オフセット位置からの部分文字列を返す。
#先頭位置は0
${変数:オフセット位置}
利用法②:
#オフセット位置からの指定した文字列長までの部分文字列を返す。
#先頭位置は0
${変数:オフセット位置:文字列長}
使用例
$ HEX_EXP='0123456789abcdef'
$ echo "${HEX_EXP:5}"
#👇開始位置(5)から文字列の最後まで抽出
56789abcdef
$ echo "${HEX_EXP:5:6}"
#👇開始位置(5)から数えて6進んだ位置(a)まで抽出
56789a
文字列パターンの削除(前方検索・後方検索)
利用法①:
#パターンを前方から検索し、最初に最短マッチした文字列を削除
${変数#パターン}
利用法②:
#パターンを前方から検索し、最初に最長マッチした文字列を削除
${変数##パターン}
利用法③:
#パターンを後方から検索し、最初に最短マッチした文字列を削除
${変数%パターン}
利用法④:
#パターンを後方から検索し、最初に最長マッチした文字列を削除
${変数%%パターン}
利用例
$ TODAYS_MEMO='今日のわんこ。今日のにゃんこ。今日のはとぽっぽ。'
$ echo ${TODAYS_MEMO#今日の*。}
#👇先頭から最短マッチで 今日のわんこ。の部分が削除される
今日のにゃんこ。今日のはとぽっぽ。
$ echo ${var##今日の*。}
#👇先頭から最長マッチで全ての文字が削除される(何も表示されない)
$ echo ${TODAYS_MEMO%今日の*。}
#👇末尾から最短マッチで 今日のはとぽっぽ。の部分が削除される
$ echo ${TODAYS_MEMO%%今日の*。}
#👇末尾から最長マッチで全ての文字が削除される(何も表示されない)
デフォルト値の置き換え
利用法①:
#変数に値が設定してない・ヌルが設定してある場合に、
#デフォルト値として呼び出されます
${変数:-デフォルト値}
利用法②:
#変数に値が設定してない・ヌルが設定してある場合に、
#デフォルト値として呼び出され、
#かつ、その変数にデフォルト値が設定されます。
${変数:=デフォルト値}
利用法③:
#上の2つとは逆に変数に値が設定・定義してある状態の場合に、
#デフォルト値として呼び出されます。
${変数:+デフォルト値}
使用例
#👇明示に変数の値を未設定にする
$ unset HOGE
$ echo "${HOGE:-PIYO}"
#👇変数HOGEは未設定なのでPIYOがデフォルトとして表示
PIYO
$ echo "$HOGE"
#👇続けて変数HOGEを呼び出してもデフォルト値は設定されていない
$ echo "${HOGE:=FUGA}"
#👇変数HOGEは未設定なのでFUGAがデフォルトとして表示
FUGA
$ echo "$HOGE"
#👇続けて変数HOGEを呼び出すと、今度は直前の操作でデフォルト値も設定されている
FUGA
$ echo "${HOGE:+MOFU}"
#👇変数HOGEにFUGAが設定されているので、デフォルト値はMOFUで置き換わる
MOFU
#👇再び変数HOGEの値を未設定にする
$ unset HOGE
$ echo "${HOGE:+MOFU}"
#👇再度実行すると今度は変数HOGEが未設定なのでデフォルト値は置き換わらない
変数の間接的な呼び出し
利用法:
${!変数}
利用例
$ HOGE=32
$ piyo='HOGE'
$ echo "${piyo}"
#👇当然piyoの保持する文字列が返される
HOGE
$ echo "${!piyo}"
#👇piyoの持つHOGEという文字列から変数HOGEが間接的に呼び出される
32
$ args_test () {
for (( i=1; i<="$#"; i++ )); do
echo "${i}"
done
}; args_test -x -y -x
#👇変数iの値が呼び出される
1
2
3
args_test () {
for (( i=1; i<="$#"; i++ )); do
echo "${!i}"
done
}; args_test -x -y -x
#👇$1と$2と$3の引数が呼び出される
-x
-y
-x
まとめ
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー