• ベストアンサー

デーモン制御スクリプトにある比較文のxの意味

/etc/init.dにあるデーモン制御スクリプトを見ていると、下記のような比較が 結構見当たりますが、 if [ x"${ATALKD_RUN}" != x"no" ]; then この文字列の左にあるxにどんな意味があるのでしょうか。 if [ "${ATALKD_RUN}" != "no" ]; then と、違いはあるのですか。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

 ATALKD_RUN='-e' だった場合  if [ "${ATALKD_RUN}" != "no" ]; then は  if [ -e != no ]; then になります。 [ コマンドの実装によっては、 -e != (!=というファイルが存在する) と no (余分な引数) と解釈されてエラーになってしまいます。 また、 ATALKD_RUN= と空の場合は if [ != no ]; then と展開されて、!=の左辺が無い、ということもあったそうです。 # 手許のtestコマンドでは、いずれも期待通りに 文字列比較してくれました。 xを付けると、  ATALKD_RUN='-e' → if [ x-e != xno ]; then  ATALKD_RUN= → if [ x != xno ]; then と、期待通りに動作してくれるようになる、ということです。

mirin_2005
質問者

お礼

ありがとうございます。 コマンドオプションとみなされる他、ダブルクオートで括った空文字列をまともに文字列と見なさい系もあり得るということでしょうか。 実際に実験もしていただいたということでベストアンサーにさせていただきます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

変数の値がどんな値かわからないとき、例えば、VAR="-f" だったりすると、 [ "$VAR" != no ] が、 [ -f != no ] となって、 -f がtestコマンドの演算子と見なされてしまうんじゃないかという心配からのようです。x を付けておけば、[ x-f != xno ] と演算子に見なされるおそれがない。 ただ、実際には、オペランドの個数などで判断されてこういう場合も(xをつけなくても)大丈夫です。 (昔はだめだったのかも) -a や -o や ! がからんで複雑なケースだと x なしだとだめなケースもありそうです。

mirin_2005
質問者

お礼

ありがとうございます。 なるほど、万一testコマンドのオプションとみなされる文字列が入っても期待外れの動作をしないための自衛策だったわけですね。実経験に基づくtipsのようでなかなか興味深い話です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

古来からの伝統です.

関連するQ&A