シェルにおける変数の扱いに関する考察

シェルに関するちゃんとした本は読んだことがないので想像なんだけど、シェルの変数ってのは式が評価される前に展開されるんじゃないかな。こんな感じ。

[ -n $UNDEFINED ]
# $UNDEFINED は未定義だから……

# 展開すると:
[ -n            ]

これが真になるから、先のエントリのようなことになるのではないだろうか。

[ -n ] && echo hoge # ==> hoge
[ -z ] && echo hoge # ==> hoge

アタリ。そもそも引数が渡ってない。

せっかくだから引数の数を数えてみれば間違い無いだろう。
未定義の変数を渡しても数に入らないはずだ。

count_args()
{
   echo $#
}

count_args $HOGE $FUGA foo bar # ==> 2


むむ、これでは、for-in の場合、未定義な変数や空文字列の変数を渡すと構文エラーになったりしないんだろうか?ならないとしたら、inの後に何もなくても大丈夫なはず。

for i in $HOGE; do echo $i; done # ==> 出力ナシ

HOGE=""
for i in $HOGE; do echo $i; done # ==> 出力ナシ

for i in; do echo $i; done       # ==> 出力ナシ

おお!!予想通り。

まとめ

シェルスクリプトにおける変数はどうもオブジェクトとかボックスじゃなくて文字列レベルの話っぽい。