echo $”hoge” と echo $’fuga’ みたいな引用符直前のドル記号の意味
あるプログラムを Linux でサービス起動させたくて、
 /etc/init.d にあるスクリプトを参考にしようと眺めてたら。
引用符の前にドル記号が付いてる echo が
 沢山出てきて何だこれはってなったので調べてみた。
例えば samba ではこんなの。
$ grep -A 14 '^start' /etc/init.d/smb
start() {
  KIND="SMB"
  echo -n $"Starting $KIND services: "
  daemon smbd $SMBDOPTIONS
  ...
}
二重引用符の前にあるドル記号の意味
多言語対応用っぽい。
 記号が上手く検索出来ないのと、ググり力不足とで、調べるのに苦労した。
多分こんな動き
echo $"hoge" を見つけると、言語 ($LANG あたり) に合ったメッセージを探す。
 メッセージは $TEXTDOMAINDIR/<言語>/LC_MESSAGES/$TEXTDOMAIN.mo か、
 /usr/share/locale/<言語>/LC_MESSAGES/$TEXTDOMAIN.mo から取り出してくれる。
冒頭に書いたサービス起動メッセージも確かに定義されてた。
 init.d スクリプトでは、大体 /etc/rc.d/init.d/functions が使われてる。
 ここには TEXTDOMAIN=initscripts が定義されてる。
 なので /usr/share/locale/ja/LC_MESSAGES/initscripts.mo を覗いてみた。
$ msgunfmt /usr/share/locale/ja/LC_MESSAGES/initscripts.mo 2>/dev/null | grep -A 1 'Starting $KIND services: '
msgid "Starting $KIND services: "
msgstr "$KIND サービスを起動中: "
試してみる
LANG を変えたら確かにメッセージ変わった。
 ローカライズされてることは使ってて何となく知ってたけど、
 こんな仕組みだとは知らなかった。
# LANG=en_US.UTF-8
# service smb start
Starting SMB services:                                     [  OK  ]
Starting NMB services:                                     [  OK  ]
# LANG=ja_JP.UTF-8
# service smb start
SMB サービスを起動中:                                      [  OK  ]
NMB サービスを起動中:                                      [  OK  ]
参考
- BashFAQ/098 How to add localization support to your bash scripts - Greg’s Wiki
 - シェルスクリプトの多言語対応 - レピカグループの技術者ブログ
 - /etc/init.d/functions の解説 - 覚え書き
 
単一引用符の前にあるドル記号の意味
上記を調べてるとき、知人に教えて貰った。
 二重引用符とは全く違う動き。
echo -e の範囲限定版みたいな感じ。
 $'...' の部分だけエスケープが有効になる。
試してみる
$ echo '\n''\\n'
\n\\n
$ echo -e '\n''\\n'
\n
$ echo $'\n''\\n'
\\n
$ echo $'\n'$'\\n'
\n
参考
まとめ
-  
echo $"hoge"は多言語対応用。 -  
echo $'fuga'はエスケープ有効化。