エスケープシーケンス

これまでの連載の中で、明確に説明せずになんとなく使ってきたものがあります。PowerShellの文字列リテラルの表記です。今回は、文字列リテラルの表記について紹介します。リテラル(literal)とは、$aや$strのような値が変化する変数ではなく、プログラム中に固定的な値として直接表記する数値や文字列のことです。定数とも呼びます。

PowerShellの文字列リテラル表記にも、多くのプログラム言語と同様にエスケープシーケンスがあります。エスケープシーケンスとは、エスケープ文字と呼ばれる特定の文字に続く文字列と組み合わせて、文字列中に特別な意味を埋め込む機能です。たとえば、エスケープシーケンス「`r`n」は改行コードを意味します。「ここで改行`r`nします」という文字列を出力すると、「ここで改行」で1行、次の行に「します」を出力します。

文字列中の「`r`n」で改行します。

UNIX系の環境では、バックスラッシュ「\」(日本語環境では「¥」)をエスケープ文字に使うシステムが多くありますが、PowerShellでは半角文字のバッククォーテーションマーク「`」をエスケープ文字として使用します。Windowsではディレクトリ区切りマークとして「\」を使っているため、UNIX系OSのように「\」をエスケープ文字に使うと使い勝手が悪くなるためです。

日本語環境ではなじみの薄い文字なので、シングルクォーテーションマーク「'」と勘違いしないよう注意して下さい。一般的な日本語キーボードは、[Shift]キーを押しながら[@]キーを押して入力します。

※ キー数を集約しているノートPCでは、機種独自の位置にバッククォーテーションマーク「`」を割り当てていることがあります。

PowerShellのエスケープシーケンスには、以下のようなものがあります。

エスケープシーケンス 意味 補足
`n ラインフィード 次の行に進みます。(当記事末尾のコラム参照)
`r キャリッジリターン 行頭に戻ります。(当記事末尾のコラム参照)
`t タブ 水平タブ
`a アラート 環境によって警告音(アラーム)を出したり、画面を点滅させたりします。
`' シングルクォーテーションマーク 文字列中にシングルクォーテーションマークを使いたい時
`" ダブルクォーテーションマーク 文字列中にダブルクォーテーションマークを使う時
`0 Null文字 文字コード0。何もないことを意味する特殊文字。
`` バッククォーテーションマーク 文字列中にバッククォーテーションマークを使う時

「今年の`"夏`"は`r`nとっても~`t``暑`'かった。」を表示すると、「`r`n」で改行、「`t」でタブになります。

クォーテーションマークの違い

前述のエスケープシーケンスを踏まえて、次に文字列リテラルを指定するクォーテーションマーク(引用符)の違いを説明します。PowerShellで文字列リテラルを表現する時、半角ダブルクォーテーションマーク「"」でくくるか、半角シングル-クォーテーションマーク「'」でくくるか、どちらも使えます。しかし、シングルクォーテーションとダブルクォーテーションの文字列は、どちらでも同じというわけではなく、明確な違いがあります。

まず、「'」でくくった場合ですが、より厳格な文字列リテラル表記となります。文字列中にどんな文字があっても、そのままの文字として扱います。ただし、例外として、文字列中に「'」を使いたい時だけは、'を二重に記述することで表現します。

一方、「"」でくくった場合は、文字列中にエスケープシーケンスや変数があった場合、それを実行時に展開します。

文字列中のシングルクォーテーションマーク1文字は、シングルクォーテーションマーク2個「''」で表現します。

「'」でくくった文字列では、エスケープシーケンスや変数を展開しません。(例外は「''」)

「"」でくくった文字列では、エスケープシーケンスや変数を展開します。PROCESSOR_IDENTIFIERは、プロセッサの種類を保持する環境変数です。

なお、「'」でくくった文字列中では「"」を、「"」でくくった文字列中では「'」をエスケープシーケンス無しで使えます。そこで、「"」を含む文字列は「'」で、「'」を含む文字列は「"」で文字列を記述すると便利です。

"..."の中では'を、'...'の中では"を直接記述できます。

変数展開を利用した例

以下のプログラムは、「"」でくくった文字列で変数を展開する機能を利用した例です。

for ( $i = 1; $i -le 5; $i++ )
{
    $j = $i * 3
    Write-Host "現在カウントは $i です。$i * 3 は、$j です。"
}

変数 $i をfor文で1から5まで繰り返し、Write-Hostコマンドレットでメッセージを表示します。文字列中の変数$iと$jが自動的に展開されます。

サンプルプログラムの実行結果。なお、文字列中に計算式を埋め込めるわけではありませんので、たとえば$iが3のとき、「"$i * 3"」と文字列を記述しても「9」にはなりません。「3 * 3」という文字列になります。

変数展開の注意

文字列中に変数を記述する時は、変数の前後にスペースを入れましょう。特に、変数の後ろ側のスペースは必須です。英文では「This variable holds $i points.」のように単語間がスペースで区切られるので、変数名が明確です。しかし、文字が連続する日本語文で「この変数の値は$iです」と記述しても、「$i」が変数名か「$iで」が変数名か「$iです」が変数名なのか、PowerShellは区切りを識別できません。このため、変数名の後ろに空白を入れて、明示的に変数名を他の文字列から区切る必要があります。

視認性を良くするためには、変数名の前後ともスペースや改行で他の文字列と区切った方がいいでしょう。

ヒア文字列

最後にヒア文字列を紹介します。

ヒア文字列は、プログラム中のヒア文字列開始引用符とヒア文字列終了引用符の間の文字列を、改行コードも含めてすべて1つの文字列として扱う機能です。長い文字列や複数行の文字列をプログラム中で使う時に便利です。

ヒア文字列引用符は、以下の2パターンです(半角文字表記)。通常の文字列リテラルと同様に「'」によるものはより厳格なリテラル表記で、「"」によるヒア文字列は、文字列中のエスケープシーケンスや変数を実行時に展開します。

厳格な文字列リテラル

開始引用符 @'(改行)
終了引用符 (改行)'@

変数・エスケープシーケンスを含む文字列リテラル

開始引用符 @"(改行)
終了引用符 (改行)"@

開始引用符の直後の改行、終了引用符直前の改行はかならず必要です。改行がないと、開始・終了引用符として正しく認識しません。

$a = @'
このPCの環境変数、temp、usernameは以下の通りです。
temp = $env:temp
username = $env:username
以上。
'@

$b = @"
このPCの環境変数、temp、usernameは以下の通りです。
temp = $env:temp
username = $env:username
以上。
"@

以上を入力したら、変数$a、$bをそれぞれ表示してみて下さい。

$aでは環境変数$env:tempや$env:usernameは展開されず、$bではそれらの環境変数を展開します。

$a、$bを表示させた結果

なお、PowerShellでは環境変数も通常の変数と同じ使い勝手で利用できます。PowerShellで環境変数を通常の変数と同じように扱うには、 「$env:環境変数名」と記述します。envは環境変数のプロバイダ名です。

※ プロバイダについては、当連載の第5回記事を参照して下さい。

改行コード

コンピュータ使用する改行コードにはCR(キャリッジリターン)とLF(ラインフィード)があります。CRは行位置はそのままで桁位置を行頭に移動します。LFは、桁位置はそのままで次の行に進みます。これはタイプライターで、印字位置を印字用紙の左端に移動する(用紙を右端に移動)、あるいは次の行に移動する(用紙を1行分送る)操作の名残です。

DOSやWindowsでは、CRとLFのセットでいわゆる「改行」(次の行の先頭)になります。「`r」がCR、「`n」がLFを意味します。プログラミング言語によっては1つのエスケープシーケンスだけでCR+LFを意味しますが(例えばCでは「\n」)、PowerShellでは「`r`n」で1つの改行となるので注意して下さい。

なお、OSによってはCRだけまたはLFだけで「改行」の動作となるOSもあります。

さらに、CRだけ、LFだけ、CR+LF、いずれも1個の改行として扱うアプリケーションソフト、テキストユーティリティも少なくなく、曖昧な感がぬぐえません。