このパートでは、埋め込み可能文字列リテラルと文字列リテラルの扱いについて取り扱います。
レッスン1 埋め込み可能文字列リテラル
fluorite-7にはやたら多くの文字列の書き方がありますが、最も利用頻度が多く代表的なのはダブルクォート"で囲う方法です。
これを埋め込み可能文字列リテラルと言います。
$ fl7 '"Hello, world!"'
Hello, world!
埋め込み可能文字列リテラル内では特殊な文字が次の三つあります。
"\$
そのうち、"は埋め込み可能文字列リテラルを閉じるのに使うため、利用できません。
残りの2個は以降の項で扱います。
レッスン2 埋め込み可能文字列のエスケープ
\に続けて以下の文字列を置くと、対応する文字に置換されます。
| 文字 | 意味 |
|---|---|
\ |
\そのもの |
" |
"そのもの |
' |
'そのもの |
$ |
$そのもの |
b |
\x08 バックスペース |
f |
\x0C 書式送り |
n |
\x0A LF |
r |
\x0D CR |
t |
\x09 タブ |
0 |
\x00 NULL文字 |
x00 |
16進数文字 |
u0000 |
16進数Unicode文字 |
コンソール上でエスケープを試す際には、fl7コマンドの第1引数を囲うために'を使用済みであることに気を付けてください。
$ fl7 '"[\\][\"][\'\''][\t][\n][\x27][\u3042]"'
[\]["]['][ ][
]['][あ]
レッスン3 埋め込み可能文字列の埋め込み
埋め込み可能文字列では、次の3種類の記法によって、変数や式を文字列中に埋め込むことができます。
$ fl7 '"[$PI]"'
[3.141592653589793]
$ fl7 '"[$(PI * 100)]"'
[314.1592653589793]
$ fl7 '"[$%.3f(PI * 100)]"'
[314.159]
$PIは識別子PIで参照される値を文字列化し、その場に埋め込みます。
識別子に続けて記号類を置いてもかまいませんが、識別子として使える文字を続けて置くと、識別子とくっついてしまいます。
$ fl7 '"[$PIE][$PI0][$PIあ]"'
[PIE][PI0][PIあ]
$(PI * 100)は、$( )で囲まれた中の式を埋め込みます。)に続いてどんな文字が現れても、くっつくことはありません。
$%.3f(PI * 100)は、式PI * 100に対して、%.3fで表されるフォーマットを適用して文字列化します。
レッスン4 空白埋めフォーマット
フォーマット指定子%10sは、文字数が10文字になるように右揃えで空白を追加して整形します。
$ fl7 '"ab", -3.14 | "[$%10s(_)]"'
[ ab]
[ -3.14]
%-10sとすると、左揃えで埋めます。
$ fl7 '"ab", -3.14 | "[$%-10s(_)]"'
[ab ]
[-3.14 ]
レッスン5 0埋めフォーマット
%010s %-010sは空白の代わりに0で埋めます。
$ fl7 '"ab", -3.14 | "[$%010s(_)]"'
[00000000ab]
[00000-3.14]
$ fl7 '"ab", -3.14 | "[$%-010s(_)]"'
[ab00000000]
[-3.1400000]
ここで、一つ気になることがあります。
"$%010s(-3.14)"は00000-3.14にフォーマットされるのです。
本当は-000003.14となるのが適切そうに見えます。
そこを解決するのがd f系のフォーマットです。
$ fl7 '-3.14 | "[$%010d(_)][$%010f(_)]"'
[-000000003][-03.140000]
$ fl7 '-3.14 | "[$%-010d(_)][$%-010f(_)]"'
[-300000000][-3.1400000]
式の値をdは整数、fは小数として文字列化します。
これで一応符号が常に先頭に来るようにフォーマットされました。
レッスン6 桁数指定フォーマット
前項で、%010fを使用したフォーマットでは、結果が-03.140000と過剰に多くの桁がフォーマットされてしまいました。
小数点以下の桁数の指定は、%010.2fのように記述します。
$ fl7 '-3.14 | "[$%010.2f(_)]"'
[-000003.14]
気を付けなければならないのは、10の部分はフォーマット後文字列の全長であるという点です。
小数点より上の桁は全長から符号1文字・小数点1文字・小数部の長さを除いた長さとなります。
レッスン7 文字列リテラル
ここまで見てきたのは"で囲われる埋め込み可能文字列リテラルでしたが、ここでは'で囲われる文字列リテラルを扱います。
文字列リテラルは、埋め込み可能文字列リテラルに対して次の違いがあります。
-
$は作用せず、そのまま$を表す。 -
\は、\n等でも常に直後の1文字を表す。 -
"をそのまま書ける。 -
'をエスケープしなければ書けない。
$ fl7 \''[$][\n][\t]["][\'\'']'\'
[$][n][t]["][']
bashのエスケープを展開したものが次です。
$ echo \''[$][\n][\t]["][\'\'']'\'
'[$][\n][\t]["][\']'
文字列リテラルには埋め込みが出来ません。
更に\nで改行などもできません。
この性質は、$による埋め込みやエスケープが邪魔になるような文字列を記述するのに便利です。
まとめ
-
"abc"で埋め込み可能文字列。 - 埋め込み可能文字列では
\nなどが使える。 -
"$var"で変数埋め込み。 -
"$(formula)"で式埋め込み。 -
"$%-010.2f(formula)"とかでフォーマット指定式埋め込み。 -
'abc'は埋め込みがない文字列リテラル。 - 文字列リテラル内では
\nがnになる。