私のラボチュートリアルの1つに、チェックするコマンドがありました。
test -z $LOGNAME || echo Logname is not defined
このコマンドを実行すると、「ログ名が定義されていません」という出力が表示されます。テスト用のmanページには
> -z STRING
> the length of STRING is zero
$ LOGNAMEをエコーすると、ログイン名が出力されます。したがって、$ LOGNAMEには値があります。上記の最初のコマンドでは、コマンドの右側の部分が実行されているため、左側の部分がfalseを返したことを意味します。 $ LOGNAMEに値があるのに、なぜfalseが返されるのですか?
この線
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
testコマンドは、現在のフォルダーで言及されたファイルを検索します。別の場所からファイルをチェックする場合は、フルパスを指定し、-zオプションまたは-sオプションを使用しないでください。あなたは以下のようにすることができます:
test/usr/bin/logname && echo $ LOGNAME ||エコーログ名が定義されていません
または
test -s/usr/bin/logname && echo $ LOGNAME ||エコーログ名が定義されていません