web-dev-qa-db-ja.com

テストコマンド(linux)の-zオプションとは

私のラボチュートリアルの1つに、チェックするコマンドがありました。

test -z $LOGNAME || echo Logname is not defined

このコマンドを実行すると、「ログ名が定義されていません」という出力が表示されます。テスト用のmanページには

> -z STRING
>               the length of STRING is zero

$ LOGNAMEをエコーすると、ログイン名が出力されます。したがって、$ LOGNAMEには値があります。上記の最初のコマンドでは、コマンドの右側の部分が実行されているため、左側の部分がfalseを返したことを意味します。 $ LOGNAMEに値があるのに、なぜfalseが返されるのですか?

6
DesirePRG

この線

test -z $LOGNAME || echo Logname is not defined

ORリスト であり、次のように変換できます。

[〜#〜] do [〜#〜]echo Logname is not defined[〜#〜] if [ 〜#〜]test -z $LOGNAME[〜#〜]失敗[〜#〜]

質問でおっしゃるように、test -z $LOGNAME$LOGNAMEの長さがゼロかどうかをテストします...そうでないため、テストは失敗します。次のように||&&に置き換えると、必要な動作が得られます。

test -z $LOGNAME && echo Logname is not defined

[〜#〜] edit [〜#〜]:以下のWilliam Pursellのコメントによると、test -n(ゼロ以外のテスト-長さ文字列)と||の方が概念的に意味があるかもしれませんが、この場合は$LOGNAMEを引用する必要があります(実際、一般的に変数を引用する習慣を身につけることをお勧めします)。

test -n "$LOGNAME" || echo Logname is not defined
5
user173718

testコマンドは、現在のフォルダーで言及されたファイルを検索します。別の場所からファイルをチェックする場合は、フルパスを指定し、-zオプションまたは-sオプションを使用しないでください。あなたは以下のようにすることができます:

test/usr/bin/logname && echo $ LOGNAME ||エコーログ名が定義されていません

または

test -s/usr/bin/logname && echo $ LOGNAME ||エコーログ名が定義されていません

0