Bashでif文を記述する際にx"$var"と書く理由

たまにBashのコードで

if [ x"$var" = 'x' ] then echo 1 fi

というふうに書いているのを見て、xはどういう意味なのだろうと調べてみた。

  • http://www.gadgety.net/shin/tips/unix/shell.html
  • 「変数がNULLかわからないので」の箇所
  • http://unix.stackexchange.com/questions/136628/bash-script-x1-x

どうも、変数に-zや-fやなどのオプションが入っていた場合にif文の意味が変わってしまうのを防ぐものらしい。

試しに以下のようなスクリプトを書いて実行してみた。

#!/bin/sh set -x var='-z' if [ "$var" '' ] then echo 1 else echo 2 fi

+ var=-z + '[' -z '' ']' + echo 1 1

確かに変数に入れた文字列がオプションとして解釈されている……

とはいえ、こんなコードは書かないはずなので

-if [ "$var" '' ] +if [ "$var" = '' ]

に修正して実行してみたら、2が出力された。

http://www.gadgety.net/shin/tips/unix/shell.html のページにある

もし $answer が -f だった場合 if [ -f = yes ]; then となりエラーと判断されるかもしれません。

を試してみたが、GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)ではエラーと判断はされなかった。

とはいえ、xを前方に付けておけばオプションとして解釈される事は防げるので、古い書き方かもしれないが付けた方が良いのかもしれない。

You are using an unsupported browser and things might not work as intended. Please make sure you're using the latest version of Chrome, Firefox, Safari, or Edge.