【シェルスクリプト】変数の文字列を切り出して抽出する方法!

script
シェルスクリプトの変数の文字列を切り出して抽出したいエンジニア

shellscriptで変数の少し違う文字列を別の変数を作成して使用していると、変数管理が複雑化するので何とかしたい

管理人

そういった時に変数の文字列を切り出して抽出する事で解決します。

変数が変化すれば切り出し抽出した文字列も変化するので、管理も運用も楽です。

ということで今回は、シェルスクリプトの変数の文字列を切り出して抽出する方法を、現役エンジニアの筆者がまとめます。

windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。

目次

シェルスクリプトの変数で文字列を切り出して抽出する方法

code

今回紹介するshellscriptの変数で文字列を切り出して抽出する方法は以下の2本です。

shellscriptの変数で文字列を切り出して抽出する方法2選
  • 数字で指定して文字列を切り出して抽出する
  • パターンで文字列を切り出して抽出する

数字で指定して文字列を切り出して抽出する

文字列切り出し

シェルスクリプトの変数を数字で指定して、文字列を切り出して抽出する方法の基礎は以下です。

記述がややこしいですが、下の表のように追加するコードを意識していくと分かりやすくなります。

種類shellscript説明追加するコード
変数=文字列変数指定
${変数}変数展開${}
文字列を切り出す方法
1${変数:開始位置}開始位置前方から:開始位置
2${変数: -開始位置}開始位置後方から: -開始位置
3${変数:開始位置:個数}開始位置と個数指定: 開始位置:個数
4${変数:開始位置:-末尾指定}開始位置と末尾指定:開始位置:-末尾指定
シェルスクリプトの変数を数字で指定して文字列を切り出し抽出する方法

※2の開始位置を後方から指定する場合の「:」と「-」の間に半角スペースが必要になる事が注意する点です。

開始位置を前方から指定する文字列切り出し

では開始位置を前方から指定する文字列切り出しを行います。

以下のような変数を指定します。

suuji=0123456789

1を開始位置に指定して表示してみます。

echo ${suuji:1}

このシェルスクリプトを実行してみます。

123456789

結果は上記になりました。

シェルスクリプトで1番目を指定するのは「0」になります。今回は1を指定したので2番目の1から末尾までが表示されています。

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パターンあります。

パターンで指定して、文字列を切り出して抽出する方法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の変数で文字列を切り出して抽出する方法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
シェルスクリプトの配列を数字で指定して文字列を切り出し抽出した結果

変数をパターンで指定して、文字列を切り出して抽出する方法

パターンで指定して、文字列を切り出して抽出する方法2選
  • 文字列の先頭からパターンマッチする
  • 文字列の後方からパターンマッチする
種類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
シェルスクリプトの変数をパターンで指定して文字列を切り出し抽出した結果

パターンマッチなので「*(アスタリスク)」が使用できます。アスタリスクは任意の文字列として扱えます。

管理人

このようにシェルスクリプトの変数の文字列を切り出しする事で変数管理が楽になります。

script

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次