シェルスクリプトの文字列ダンプ機能

文字列の前に$が付いてるやつってなんだろう?

そんなメールが、偉大なるかに先生から送られてきた。例を見ると、文字列、つまり二重引用符で囲んだリテラルの前に$が付いているコードがあるらしい。

echo -n $"$prog: Synchronizing with time server: "

・・・うーん。見たことないなぁ、こんなの。

試しに簡単なスクリプトを書いてみたのだが、$を付けようが付けまいが動作に変わりはない。有識者に聞いてみたが、彼も知らないという。そんなわけで「わかんね」という返事を返す。

1時間ほどして、再び返信があった。自力で突き止めた模様。さすがはかに先生、まっこと我々の指導者としてふさわしいお方。

 -D
     二重引用符によるクォート文字列 (double-quoted strings) に 
 $ が前置されたものを、全てリストして標準出力に出力します。
 これらは、カレントロケールが C または POSIX 以外の時に、
 翻訳の対象となるべき文字列です。このオプションを指定すると、
 自動的に -n オプションも指定されたことになります。
 つまりコマンドは全く実行されません。

 --dump-strings
     -D と同じです。

理解完了。

試しにスクリプト書いてみた。

#!/bin/bash

msg=$"So long, and Thanks for All the Fish."
echo "the last message from Dolphins: $msg"

実行。

$ bash hoge.sh
the last message from Dolphins: So long, and Thanks for All the Fish.
$ bash -D hoge.sh
"So long, and Thanks for All the Fish."

ふむ!-Dを付けておくと確かに表示されるし、スクリプト自体は実行されない。これを国際化の足がかりに使う訳か。ユーザ向けに標準出力に出すメッセージには、とにかくコレを付けておいて良いのかもしれない。

っていうか、シェルスクリプトで国際化なんて考えたこともなかったよ!!