5

私はこの表現によってbashで混乱しています:

$ var="" # empty var
$ test -f $var; echo $? # test if such file exists
0 # and this file exists, amazing!
$ test -f ""; echo $? # let's try doing it without var
1 # and all ok

私はそのような bash の動作を理解できません。おそらく誰か説明できますか?

4

2 に答える 2

7

の空展開が見える$var前に取り除かれているからです。test実際に実行しているため、test -fへの引数は 1 つだけです。POSIX によると、単一の引数 likeは空ではないため true です。test-f-f

POSIX test(1) 仕様から:

1 argument:
Exit true (0) if `$1` is not null; otherwise, exit false.

ファイル名が空のファイルのテストはありません。現在、明示的test -f ""に2つの引数があり-f、「パス引数の存在をテストする」ための演算子として認識されます。

于 2012-08-01T13:59:29.293 に答える
3

varが空の場合$var、引用されているかどうかにかかわらず、動作が異なります。

test -f $var          # <=> test -f       ==>   $? is 0
test -f "$var"        # <=> test -f ""    ==>   $? is 1

したがって、この例は次のように示しています。を引用する必要があります$var

于 2012-08-01T13:59:40.360 に答える