プロが教える店舗&オフィスのセキュリティ対策術

/etc/init.dにあるデーモン制御スクリプトを見ていると、下記のような比較が
結構見当たりますが、

if [ x"${ATALKD_RUN}" != x"no" ]; then

この文字列の左にあるxにどんな意味があるのでしょうか。

if [ "${ATALKD_RUN}" != "no" ]; then

と、違いはあるのですか。

A 回答 (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
と、期待通りに動作してくれるようになる、ということです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/16 12:29

変数の値がどんな値かわからないとき、例えば、VAR="-f" だったりすると、



[ "$VAR" != no ] が、 [ -f != no ] となって、 -f がtestコマンドの演算子と見なされてしまうんじゃないかという心配からのようです。x を付けておけば、[ x-f != xno ] と演算子に見なされるおそれがない。

ただ、実際には、オペランドの個数などで判断されてこういう場合も(xをつけなくても)大丈夫です。
(昔はだめだったのかも)

-a や -o や ! がからんで複雑なケースだと x なしだとだめなケースもありそうです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2014/02/16 12:23

古来からの伝統です.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!