1. ホーム
  2. unix

[解決済み] シェルスクリプトの比較で x$VAR = xyes がよく使われるのはなぜですか?

2023-07-04 06:59:16

質問

autotools (autoconf, automake) を使用するプロジェクトのビルドスクリプトで、このようなことをよく目にします。 誰かがシェル変数の値をチェックしたいとき、彼らは頻繁にこのイディオムを使用します。

if test "x$SHELL_VAR" = "xyes"; then
...

このように単純に値をチェックするのと比べて、どのような利点があるのでしょうか。

if test $SHELL_VAR = "yes"; then
...

これをよく見るのは何か理由があるに違いないと思うのですが、それが分かりません。

どのように解決するのですか?

を行うシェルを使っている場合 シンプル 置換と SHELL_VAR 変数が存在しない (または空白) 場合は、エッジケースに注意する必要があります。以下のような翻訳が起こります。

if test $SHELL_VAR = yes; then        -->  if test = yes; then
if test x$SHELL_VAR = xyes; then      -->  if test x = xyes; then

これらのうち最初のものはエラーが発生します。 test の最初の引数がなくなっているため、エラーが発生します。2番目はそのような問題はありません。

あなたのケースは次のように翻訳されます。

if test "x$SHELL_VAR" = "xyes"; then  -->  if test "x" = "xyes"; then

x は、少なくとも POSIX 準拠のシェルでは、引用符によって空の引数とスペースを含む引数の両方が単一のオブジェクトとして解釈されるため、実際には冗長です。