シェルスクリプトで空文字列かどうか調べる。
シェルスクリプト(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