シェルスクリプトで空文字列かどうか調べる。

シェルスクリプト(sh)で、ある変数が空文字列かどうかを調べるには、testコマンドの -n (Nonzero length) または -z (Zero length) を使う……と書いてあるんだけど、コツがいる。

if [ -n $HOGE ]; then
   echo "nonzero だよ。"
fi

↑これはダメ

if [ -n "$HOGE" ]; then
   echo "nonzero だよ。"
fi

これならOK。

要は、変数が文字列埋め込みされてないと上手く動かない。何故か?はよくわからない。(シェルに於ける変数の概念はどういうものなのか?)

真理表にまとめると、こんな感じ。

-n -z
$UNDEFINED T T
$ZEROLEN T T
$NONZEROLEN T F
"$UNDEFINED" F T
"$ZEROLEN" F T
"$NONZEROLEN" T F

検証用スクリプト

#!/bin/sh

ZEROLEN=""
NONZEROLEN="nonzerolen_string"



echo -n '[ -n $UNDEFINED ]    '
if [ -n $UNDEFINED ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z $UNDEFINED ]    '
if [ -z $UNDEFINED ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -n $ZEROLEN ]      '
if [ -n $ZEROLEN ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z $ZEROLEN ]      '
if [ -z $ZEROLEN ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -n $NONZEROLEN ]   '
if [ -n $NONZEROLEN ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z $NONZEROLEN ]   '
if [ -z $NONZEROLEN ]; then echo 'T'; else echo 'F'; fi



echo -n '[ -n "$UNDEFINED" ]  '
if [ -n "$UNDEFINED" ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z "$UNDEFINED" ]  '
if [ -z "$UNDEFINED" ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -n "$ZEROLEN" ]    '
if [ -n "$ZEROLEN" ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z "$ZEROLEN" ]    '
if [ -z "$ZEROLEN" ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -n "$NONZEROLEN" ] '
if [ -n "$NONZEROLEN" ]; then echo 'T'; else echo 'F'; fi

echo -n '[ -z "$NONZEROLEN" ] '
if [ -z "$NONZEROLEN" ]; then echo 'T'; else echo 'F'; fi