shellscriptで変数の少し違う文字列を別の変数を作成して使用していると、変数管理が複雑化するので何とかしたい
そういった時に変数の文字列を切り出して抽出する事で解決します。
変数が変化すれば切り出し抽出した文字列も変化するので、管理も運用も楽です。
ということで今回は、シェルスクリプトの変数の文字列を切り出して抽出する方法を、現役エンジニアの筆者がまとめます。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
シェルスクリプトの変数で文字列を切り出して抽出する方法
今回紹介するshellscriptの変数で文字列を切り出して抽出する方法は以下の2本です。
- 数字で指定して文字列を切り出して抽出する
- パターンで文字列を切り出して抽出する
数字で指定して文字列を切り出して抽出する
シェルスクリプトの変数を数字で指定して、文字列を切り出して抽出する方法の基礎は以下です。
記述がややこしいですが、下の表のように追加するコードを意識していくと分かりやすくなります。
種類 | shellscript | 説明 | 追加するコード |
---|---|---|---|
– | 変数=文字列 | 変数指定 | – |
– | ${変数} | 変数展開 | ${} |
文字列を切り出す方法 | |||
1 | ${変数:開始位置} | 開始位置前方から | :開始位置 |
2 | ${変数: -開始位置} | 開始位置後方から | : -開始位置 |
3 | ${変数:開始位置:個数} | 開始位置と個数指定 | : 開始位置:個数 |
4 | ${変数:開始位置:-末尾指定} | 開始位置と末尾指定 | :開始位置:-末尾指定 |
※2の開始位置を後方から指定する場合の「:」と「-」の間に半角スペースが必要になる事が注意する点です。
開始位置を前方から指定する文字列切り出し
では開始位置を前方から指定する文字列切り出しを行います。
以下のような変数を指定します。
suuji=0123456789
1を開始位置に指定して表示してみます。
echo ${suuji:1}
このシェルスクリプトを実行してみます。
123456789
結果は上記になりました。
2番目から末尾までがきちんと表示されています。
開始位置を後方から指定する文字列切り出し
次に開始位置を後方から指定する文字列切り出しを行います。
1を開始位置に指定して表示してみます。
echo ${suuji: -3}
このシェルスクリプトを実行してみます。
789
結果は上記になりました。
後方始まりで3つ目から末尾までがきちんと表示されています。
開始位置と個数を指定する文字列切り出し
次に開始位置と個数を指定する文字列切り出しを行います。
開始位置を3、個数を6に指定して表示してみます。
echo ${suuji:3:6}
このシェルスクリプトを実行してみます。
345678
結果は上記になりました。
開始位置が3で個数が6つきちんと表示されています。
開始位置と末尾を指定する文字列切り出し
次に開始位置と末尾を指定する文字列切り出しを行います。
開始位置を3、末尾を-3に指定して表示してみます。
echo ${suuji:3:-3}
このシェルスクリプトを実行してみます。
3456
結果は上記になりました。
開始位置が3で後方から3番目の6までが、きちんと表示されています。
補足:配列に格納されている文字列を切り出して抽出
同じ様に配列に格納されている文字列も部分的に切り出して抽出できます。
種類 | shellscript | 説明 | 追加するコード |
---|---|---|---|
– | 配列=(文字列1 文字列2 …) | 配列に文字列格納 | – |
– | ${配列[@]} | 配列全て展開 | ${[@]} |
配列の文字列を切り出す方法 | |||
1 | ${配列[@]:開始位置} | 開始位置前方から | :開始位置 |
2 | ${配列[@]: -開始位置} | 開始位置後方から | : -開始位置 |
3 | ${配列[@]:開始位置:個数} | 開始位置と個数指定 | : 開始位置:個数 |
配列で指定する文字列切り出し
では同じ様に配列で指定する文字列切り出しを行います。以下のような配列があるとします。
array=(000 111 222 333 444 555)
1を開始位置に指定して表示してみます。
echo ${array[@]:1}
echo ${array[@]: -3}
echo ${array[@]:1:3}
このシェルスクリプトを実行してみます。
111 222 333 444 555
333 444 555
111 222 333
結果は上記になりました。
変数の文字列切り出しと同様に、配列の中身が切り出されています。
変数ではできて配列では出来ない切り出し
変数ではできていた開始位置と後方位置を指定して切り出す方法だけは配列ではできません。
echo ${array[@]:1:-1}
上のシェルスクリプトを実行してみます。
-bash: -1: substring expression < 0
配列の「開始位置と後方位置を指定して切り出す方法」はエラーで切り出しできませんでした。
パターンで文字列を切り出して抽出する
シェルスクリプトの変数をパターンで指定して、文字列を切り出して抽出する方法です。2パターンあります。
- 文字列の先頭からパターンマッチする
- 文字列の後方からパターンマッチする
パターンで指定する時のコードも纏めておきます。
種類 | shellscript | 説明 | 追加するコード |
---|---|---|---|
– | 変数=文字列 | 変数指定 | – |
– | ${変数} | 変数展開 | ${} |
文字列をパターンで切り出す方法 | |||
1 | ${変数#パターン} | 開始位置前方、最短マッチ | #パターン |
2 | ${変数##パターン} | 開始位置前方、最長マッチ | ##パターン |
3 | ${変数%パターン} | 開始位置後方、最短マッチ | %パターン |
4 | ${変数%%パターン} | 開始位置後方、最長マッチ | %%パターン |
文字列の先頭からパターンマッチする
では文字列の先頭からパターンマッチする時のシェルスクリプトを何個か記述してみます。
まず以下のような変数を指定しておきます。
mojiretsu=shellscript.sh.zp
文字列の先頭からパターンマッチ1:先頭文字指定
以下のシェルスクリプトで先頭が「shell」の文字列であれば、指定した文字列を切り取って抽出します。
echo ${mojiretsu#shell}
上のシェルスクリプトを実行してみます。
script.sh.zp
結果は指定した「shell」を切り取って抽出できています。
文字列の先頭からパターンマッチ2:最短マッチ
以下のシェルスクリプトで先頭が任意の文字列(*)で「.」の文字列があれば、最短マッチで指定した文字列を切り取って抽出します。
echo ${mojiretsu#*.}
上のシェルスクリプトを実行してみます。
sh.zp
結果は最初に「.」があった文字列までを切り取って抽出できています。
文字列の先頭からパターンマッチ3:最長マッチ
先程と同じ条件で「.」の文字列があれば、最長マッチで指定した文字列を切り取って抽出します。
echo ${mojiretsu##*.}
上のシェルスクリプトを実行してみます。
zp
結果は最後に「.」があった文字列までを切り取って抽出できています。
文字列の末尾からパターンマッチ1:先頭文字指定
今度は文字列の末尾からパターンマッチする時のシェルスクリプトを何個か記述してみます。
以下のシェルスクリプトで末尾が「zp」の文字列であれば、指定した文字列を切り取って抽出します。
echo ${mojiretsu%zp}
上のシェルスクリプトを実行してみます。
shellscript.sh.
結果は指定した「zp」を切り取って抽出できています。
文字列の末尾からパターンマッチ2:最短マッチ
以下のシェルスクリプトで末尾が任意の文字列(*)で「.」の文字列があれば、最短マッチで指定した文字列を切り取って抽出します。
echo ${mojiretsu%.*}
上のシェルスクリプトを実行してみます。
shellscript.sh
結果は末尾から見て最初に「.」があった文字列までを切り取って抽出できています。
文字列の末尾からパターンマッチ3:最長マッチ
先程と同じ条件で「.」の文字列があれば、最長マッチで指定した文字列を切り取って抽出します。
echo ${mojiretsu%%.*}
上のシェルスクリプトを実行してみます。
shellscript
結果は末尾から見て最後に「.」があった文字列までを切り取って抽出できています。
まとめ:シェルスクリプトの変数で文字列を切り出して抽出する方法
shellscriptの変数で文字列を切り出して抽出する方法は以下の2本でした。
- 数字で指定して文字列を切り出して抽出する
- パターンで文字列を切り出して抽出する
数字で指定して文字列を切り出して抽出する
種類 | shellscript | 説明 | 実行結果 |
---|---|---|---|
– | suuji=0123456789 | 変数指定 | – |
– | ${suuji} | 変数展開 | 0123456789 |
文字列を切り出す方法 | |||
1 | ${suuji:3} | 開始位置前方から | 3456789 |
2 | ${suuji: -3} | 開始位置後方から | 789 |
3 | ${suuji:3:6} | 開始位置と個数指定 | 345678 |
4 | ${suuji:3:-3} | 開始位置と末尾指定 | 3456 |
※2の開始位置を後方から指定する場合の「:」と「-」の間に半角スペースが必要になる事が注意する点です。
配列に格納されている文字列を切り出して抽出
種類 | shellscript | 説明 | 実行結果 |
---|---|---|---|
– | array=(00 11 22 33 44 55) | 配列に文字列格納 | – |
– | ${array[@]} | 配列全て展開 | 00 11 22 33 44 55 |
配列の文字列を切り出す方法 | |||
1 | ${array[@]:1} | 開始位置前方から | 11 22 33 44 55 |
2 | ${array[@]: -3} | 開始位置後方から | 33 44 55 |
3 | ${array[@]:1:3} | 開始位置と個数指定 | 11 22 33 |
変数をパターンで指定して、文字列を切り出して抽出する方法
- 文字列の先頭からパターンマッチする
- 文字列の後方からパターンマッチする
種類 | shellscript | 説明 | 実行結果 |
---|---|---|---|
– | mojiretsu=shellscript.sh.zp | 変数指定 | – |
– | ${mojiretsu} | 変数展開 | shellscript.sh.zp |
文字列をパターンで切り出す方法 | |||
1 | ${mojiretsu#shell} | 開始文字指定 | script.sh.zp |
2 | ${mojiretsu#*.} | 開始位置前方、最短マッチ | sh.zp |
3 | ${mojiretsu##*.} | 開始位置前方、最長マッチ | zp |
4 | ${mojiretsu%zp} | 開始文字後方指定 | shellscript.sh. |
5 | ${mojiretsu%.*} | 開始位置後方、最短マッチ | shellscript.sh |
6 | ${mojiretsu%%.*} | 開始位置後方、最長マッチ | shellscript |
このようにシェルスクリプトの変数の文字列を切り出しする事で変数管理が楽になります。