bashの配列をjoinする方法
bashの配列をjoinする方法を紹介します。
1.問題点
bashで次のようなリストを作成しました。
#!/bin/bash
declare -a list=("a" "b" "c")
この配列変数listの各データをカンマで結合させて1つのデータにしたいのですが、方法がわかりません。
ということで、bashの配列をjoinする方法を紹介します。
2.bashの配列をjoinする
bashの配列をjoinするには、IFSを利用します。
#!/bin/bash
declare -a list=("a" "b" "c")
result="$(IFS=","; echo "${list[*]}")"
echo ${result}
実行結果
a,b,c
IFSは区切り文字の環境変数です。bashの場合、空白文字が区切り文字として初期設定されています。
これを強制的に書き替えたあと、配列を
${配列名[*]}
の形式で出力すると、書き替えたIFSを区切り文字と利用します。
ここではサンプルを簡単にするために区切り文字を書き替えたままにしていますが、処理のあとで空白文字を区切り文字として利用する場合は元に戻しましょう。
#!/bin/bash
declare -a list=("a" "b" "c")
backup=$IFS
result="$(IFS=","; echo "${list[*]}")"
IFS=$backup
echo ${result}
コマンドの実行結果をdiffする方法
コマンドの実行結果をdiffする方法を紹介します。
1.問題点
次のlsコマンドの実行結果を2つ取得し、取得結果の差分をdiffで取得したいのです。
$ ls -1 /home/foo/test1
$ ls -1 /home/foo/test2
次のように実行結果をファイルに出力すれば簡単にdiffできるのですが、できればファイル出力なしで実施したいです。
$ ls -1 /home/foo/test1 > /home/foo/result1
$ ls -1 /home/foo/test2 > /home/foo/result2
$ diff /home/foo/result1 /home/foo/result2
ということで、コマンドの実行結果をdiffする方法を紹介します。
2.コマンドの実行結果をdiffする
コマンドの実行結果をdiffするには、リダイレクションを使って、コマンドの実行結果をdiffの入力にします。
$ diff <(ls -1 /home/foo/test1) <(ls -1 /home/foo/test2)
bashのif文で正規表現を使用する方法
bashのif文で正規表現を使用する方法を紹介します。
1.問題点
#!/bin/bash
foo=abc123efg
変数fooの中から"123"だけを取り出したいのですが、方法が分かりません。
ということで、bashのif文で正規表現を使用する方法を紹介します。
2.if文で正規表現を使用する
if文で正規表現を使用するには次のようにします。
#!/bin/bash
foo=abc123efg
if [[ ${foo} =~ ^[a-z]+([0-9]+).*$ ]]; then
echo ${BASH_REMATCH[1]}
fi
実行結果
123
ポイントは下記のとおりです。
- if文はブラケット(大カッコ)を二重にする
- 演算子は"=~"
- 正規表現はクォーテーションで括らない(正規表現で特別扱いの文字がバックスラッシュでエスケープされるため)
- 後方参照(カッコで囲った部分)は ${BASH_REMATCH[1]} で取得(複数ある場合、[2][3]…で取得)
Perl系の表記方法("\d"や"\w"など)は使えないみたいなので、POSIX表記を利用します。
\w→[:alnum:]
\d→[:digit:]
\s→[:blank:]
詳細は"info -f 'grep' -n 'Character Classes and Bracket Expressions"で確認できます。
if文の中でPOSIX表記を使う場合、さらに"[]"で括る必要があります。
上記のサンプルを一部POSIX表記に直したものが下記です。
#!/bin/bash
foo=abc123efg
if [[ ${foo} =~ ^[a-z]+([[:digit:]]+).*$ ]]; then
echo ${BASH_REMATCH[1]}
fi
実行結果
123
3.参考サイト
参考サイトは下記です。ありがとうございました。