GNU/Linux >> Linux の 問題 >  >> Linux

bashはどのように「false」をテストしますか?

シェル構文は、コンテキストに大きく依存します。つまり、特定のもの (true など) または false ) の意味は、それが発生する場所に大きく依存します。あなたの例では、 false コマンド、文字列値、および整数値を含む (存在しない) 変数名です。例を見てみましょう:

  • false コマンドとして:

    false; echo $?    # prints "1"
    if false; then echo "yep"; else echo "nope"; fi    # prints "nope"
    

    「false」という名前のコマンド (通常は /usr/bin/false、または同じことを行う bash ビルトイン) がありますが、実際には何も実行せず、失敗ステータスで終了します。終了ステータスとして、0 は成功 (真実のようなもの) を示し、0 以外は失敗 (偽のようなもの) を示します。これは、より一般的なゼロ =false、ゼロ以外 =true の規則の反対ですが、終了ステータスの場合はより理にかなっています。

  • false 未解釈の文字列値として:

    if [[ false ]]; then echo "yep"; else echo "nope"; fi     # prints "yep"
    if [[ true ]]; then echo "yep"; else echo "nope"; fi      # prints "yep"
    if [[ wibble ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    if [[ "this is a string" ]]; then echo "yep"; else echo "nope"; fi    # prints "yep"
    [[ false ]]; echo $?    # prints "0" (=success)
    [ false ]; echo $?      # prints "0" (=success)
    test false; echo $?     # prints "0" (=success)
    

    これらすべての場合において、コマンド test またはその類義語 [ または bash 条件式 [[ ]] 式を取得せず、単一の文字列のみを取得したため、非常に単純なテストを実行します。長さがゼロでない文字列か? 「true」、「false」、「wibble」などはすべて長さが 0 ではないため、コマンド/式は真のようになり、成功します。比較:

    [[ "" ]]; echo $?    # prints "1" (=failure), because the string is zero-length
    [[ ]]; echo $?       # prints "1" (=failure), because there isn't even a string
    [ ]; echo $?         # same
    

    test に注意してください そして [ は通常のコマンドであり、「false」(および「wibble」など) は単なる引数です。 [[ ]] コマンドの代わりに使用できる bash 構文です。それらの引数/内容は、コマンド名自体とは異なる方法で解析されます。

  • false 整数を含む可能性のある変数名として:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    

    これは少し奇妙で、bash の [[ ]] の詳細に依存します。 数値が等しいかどうかをテストします。 [[ ]] にあることに注意してください (そして [ ] そして test 式)、-eq 数値が等しいかどうかのテスト、および = 文字列が等しいかどうかをテストします。たとえば、[[ 01 -eq 1 ]] (1 と 01 は数値的に等しいため) は true ですが、[[ 01 = 1 ]] false です (同じ文字列ではないため)。 [[ false -eq true ]]の場合 、「true」および「false」は整数値ではないため、bash はそれらを変数名として扱う (そして変数に整数値が含まれることを期待する) ことによって、それらを整数に変換しようとします。実際、どちらも変数として定義されていないため、どちらも空の文字列として評価され、整数 0 として解釈されます。観察:

    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # prints "equal"
    if [[ false -eq 0 ]]; then echo "equal"; else echo "nope"; fi        # prints "equal"
    false=5
    if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi     # now prints "nope"
    

    false を定義することに注意してください 変数は他の用途に影響を与えないため。コマンドとして使用すると、ステータス 1 で終了します。文字列として使用すると、「false」のままです (「5」ではありません)。


Linux
  1. Bashスクリプトをデバッグする方法は?

  2. バンをエコーする方法!?

  3. .bashrcの目的とそれはどのように機能しますか?

  1. -sと[[]]は、BashのIf条件で何を意味しますか?

  2. エコー$は何ですか?行う??

  3. cat << EOFはbashでどのように機能しますか?

  1. Bashでループを作成する方法

  2. Bashまたは他の言語/フレームワークで整数とフロートの計算を行う方法は?

  3. BASH:パイプ内の数値に対して算術演算を実行する方法