- ベストアンサー
デーモン制御スクリプトにある比較文のxの意味
/etc/init.dにあるデーモン制御スクリプトを見ていると、下記のような比較が 結構見当たりますが、 if [ x"${ATALKD_RUN}" != x"no" ]; then この文字列の左にあるxにどんな意味があるのでしょうか。 if [ "${ATALKD_RUN}" != "no" ]; then と、違いはあるのですか。
- みんなの回答 (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 と、期待通りに動作してくれるようになる、ということです。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4901/10362)
変数の値がどんな値かわからないとき、例えば、VAR="-f" だったりすると、 [ "$VAR" != no ] が、 [ -f != no ] となって、 -f がtestコマンドの演算子と見なされてしまうんじゃないかという心配からのようです。x を付けておけば、[ x-f != xno ] と演算子に見なされるおそれがない。 ただ、実際には、オペランドの個数などで判断されてこういう場合も(xをつけなくても)大丈夫です。 (昔はだめだったのかも) -a や -o や ! がからんで複雑なケースだと x なしだとだめなケースもありそうです。
お礼
ありがとうございます。 なるほど、万一testコマンドのオプションとみなされる文字列が入っても期待外れの動作をしないための自衛策だったわけですね。実経験に基づくtipsのようでなかなか興味深い話です。
- Tacosan
- ベストアンサー率23% (3656/15482)
古来からの伝統です.
お礼
ありがとうございます。 コマンドオプションとみなされる他、ダブルクオートで括った空文字列をまともに文字列と見なさい系もあり得るということでしょうか。 実際に実験もしていただいたということでベストアンサーにさせていただきます。