hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

bash変数展開の使い方



1 bashの変数展開とは?

変数展開とは、${変数}として変数を実際の値に展開することです。さらに、${変数:条件}のように条件を指定して、指定した条件で変数を展開することができます。ここでは、条件を指定した変数展開についていくつか確認をしてみます。
なお、bashスクリプトの書き方はbashスクリプトの書き方 - hana_shinのLinux技術ブログを参照ください。

2 検証環境

AlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

bashの版数は以下のとおりです。

[root@server ~]# bash --version
bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)
-snip-

3 変数の長さを求める方法

書式 意味
${#変数} 変数の長さをもとめる

変数の長さを求めるテストプログラムを作成します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

str="0123456789"
echo ${str}
echo ${#str}

テストプログラムを実行します。2行目の結果より、変数の長さが10であることがわかります。

[root@server ~]# ./tp.sh
0123456789
10

4 オフセットを指定して変数から文字列を取り出す方法

書式 意味
${変数:オフセット} 指定したオフセットから文字列を取り出す
${変数:オフセット:長さ} 指定したオフセットから指定した長さの文字列をとりだす

テストプログラムを作成します。2つ目のechoコマンドは変数のオフセット3の位置から文字列を取り出して表示します。3つ目のechoコマンドは変数のオフセット3の位置から2文字取り出して表示します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

str="0123456789"
echo ${str}
echo ${str:3}
echo ${str:3:2}

テストプログラムを実行します。2行目の結果より、変数のオフセット3から末尾まで文字列を取り出していることがわかります。また、3行目の結果より、変数のオフセット3から2文字取り出していることがわかります。

[root@server ~]# ./tp.sh
0123456789
3456789
34

5 文字列を削除する方法

5.1 変数の先頭から文字列を削除する方法

書式 意味
${変数#パターン} 変数の部分がパターンと一致した場合、最も短く一致(最短一致)する部分を削除して残りの文字列を返す
${変数##パターン} 変数の部分がパターンと一致した場合、最も長く一致(最長一致)する部分を削除して残りの文字列を返す

テストプログラムを作成します。2つ目のechoコマンドは、tで始まりisで終わる最短一致の文字列を削除した後の文字列を表示します。3つ目のechoコマンドは、tで始まりisで終わる最長一致の文字列を削除した後の文字列を表示します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

str="this is a dog"
echo ${str}
echo ${str#t*is}
echo ${str##t*is}

テストプログラムを実行します。2行目の結果より、変数から最短一致の文字列を削除した結果がis a dog、3行目の結果より、最長一致の文字列を削除した結果がa dogであることがわかります。

[root@server ~]# ./tp.sh
this is a dog
is a dog
a dog

もう1つ実施例を示します。httpdの設定ファイルのパス名(/etc/httpd/conf/httpd.conf)から、"/"で始まり"/"で終わる最長一致の文字列を削除して、ファイル名を取り出すテストプログラムを作成します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

path="/etc/httpd/conf/httpd.conf"
echo ${path}
echo ${path##/*/}

テストプログラムを実行します。/etc/httpd/conf/httpd.confから/etc/httpd/conf/の部分が削除されて、httpd.confが表示されていることがわかります。

[root@server ~]# ./tp.sh
/etc/httpd/conf/httpd.conf
httpd.conf

5.2 変数の末尾から文字列を削除する方法

書式 意味
${変数%パターン} 変数の部分がパターンと一致した場合、最も短く一致する部分を削除して残りを返す
${変数%%パターン} 変数の部分がパターンと一致した場合、最も長く一致する部分を削除して残りを返す

テストプログラムを作成します。2つ目のechoコマンドは、"."で始まり、任意の文字で終わる最短一致の文字列を削除した後の文字列を表示します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

path="/etc/httpd/conf/httpd.conf"
echo ${path}
echo ${path%.*}

テストプログラムを実行します。2行目の結果より、httpd.confの"."から末尾にかけての文字が削除され、残りの文字列が表示されていることがわかります。

[root@server ~]# ./tp.sh
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd

6 文字列を置換する方法

書式 意味
${変数/パターン/置換文字列} 変数の先頭から最初にパターンに一致した文字列を置換文字列に置き換える
${変数//パターン/置換文字列} 変数の先頭からパターンに一致した全ての文字列を置換文字列に置き換える

テストプログラムを作成します。2つ目のechoコマンドは変数の最初のaをAに置き換えた文字列を表示します。3つ目のechoコマンドは変数の全てのaをAに置き換えた文字列を表示します。

[root@server ~]# cat tp.sh
#!/usr/bin/bash

str="abcabc"
echo ${str}
echo ${str/a/A}
echo ${str//a/A}

テストプログラムを実行します。2行目の結果より、変数の最初のaがAに置き換わっていることがわかります。また、3行目の結果より、変数の全てのaがAに置き換わっていることがわかります。

[root@server ~]# ./tp.sh
abcabc
Abcabc
AbcAbc

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ