(2024-06-06 初稿)
Bashにヒヤドキュメントがあるのは知っていたが、ヒヤストリングというのがあるのをつい最近知った。
ヒヤストリングを使ってみると、便利なので備忘録としてアップする。
ヒヤドキュメント
まずは、ヒヤドキュメント。
$ cat << EOC こちらは、ヒヤドキュメント ヒヤドキュメントは長文の入出力などで便利に使える EOC こちらは、ヒヤドキュメント ヒヤドキュメントは長文の入出力などで便利に使える
上記のように長文の入出力で便利に使える。
ヒヤストリング
続いて、本題のヒヤストリング。
ヒヤストリングは、長文の文字等を変数に保存する。
$ here_str=$( cat << EOC こちらは、ヒヤストリング ヒヤストリングも使うと便利になる この記事では、ヒヤドキュメントとヒヤストリングを扱う EOC )
または、もっと簡単にダブルクォートで複文を変数に入力する。
here_str="こちらは、ヒヤストリング ヒヤストリングも使うと便利になる この記事では、ヒヤドキュメントとヒヤストリングを扱う"
上記2例のどちらも、文字列変数なのでechoコマンドで出力できる。
ダブルクォートで囲んだ場合は、変数をダブルクォートで囲むことを忘れないで
echo "$here_str" こちらは、ヒヤストリング ヒヤストリングも使うと便利になる この記事では、ヒヤドキュメントとヒヤストリングを扱う
ここまでのところ、ヒヤドキュメントとヒヤストリングに違いはなく、ヒヤストリングのメリットは今のところ無い。
ヒヤストリングの便利なところ
今のところ気づいているヒヤストリングのメリットは以下のとおり。
- パイプを使わずに一文ずつ処理できる
- read関数と併用することにより、引数等の受け渡しが楽になる
以下、それぞれを解説する。
パイプを使わずに一文ずつ処理できる
以下のとおり、whileとともに使うことにより、パイプを使わずに1行ずつ処理をするスクリプトを作ることができる。
here_str="こちらは、ヒヤストリング ヒヤストリングも使うと便利になる この記事では、ヒヤドキュメントとヒヤストリングを扱う" while read line do echo $line | sed "s/ヒヤ/here/g" done <<< "$here_str" こちらは、hereストリング hereストリングも使うと便利になる この記事では、hereドキュメントとhereストリングを扱う
パイプを使うと、サブシェルの動作となり、関数内でのグローバル変数の変更できない等の罠を回避することができる。
read関数と併用することにより、引数等の受け渡しが楽になる
こちらの方がメリットが大きいと思われるが、read関数を利用することにより、関数への引数の受け渡しや文の配列への入力が格段に便利になる。
arg_str="arg1 arg2 arg3" read -a line_ary <<< "$arg_str" echo ${line_ary[0]} echo ${line_ary[1]} echo ${line_ary[2]} arg1 arg2 arg3
readに -a オプションを付けることにより、配列(line_ary)にIFSで文字列を区切って入れることができる。
もし、変数がスペースでなく、カンマ(,)等で区切られていた場合でも、IFSを一時的に変更して読み込めば良い。
arg_str="arg1,arg2,arg3" IFS=, read -a line_ary <<< "$arg_str" for s in "${line_ary[@]}" # forループで配列の要素を一つずつ do echo "$s" done echo $IFS #IFSが変更されないことの確認 arg1 arg2 arg3
添え字が必要な場合は、"${!line_ary[@]}"のように添え字のリストの配列から一つずつforで取り出すと便利。
for i in "${!line_ary[@]}" do echo "$i => ${line_ary[$i]}" done 0 => arg1 1 => arg2 2 => arg3
以上のように、文字列を任意の区切り文字(IFS)で配列にすることが容易になる。
多数の引数を関数に渡す場合などは、ヒヤストリングを引数とし、関数内で配列にした方が便利だと思われる。
参考までに、上記を利用して作成したスクリプトが以下のページにあるので、興味がある方はご覧になって。
以上、どなたかの参考になれば幸い。