How does the keyword “if” test if a value is true or false?

前端 未结 3 1449
没有蜡笔的小新
没有蜡笔的小新 2021-02-04 06:33

In bash script

if [ 1 ]
then
   echo \"Yes\"
else
   echo \"No\"
fi

Output: Yes

It

相关标签:
3条回答
  • 2021-02-04 06:54

    In unix land, 0 is true and 1 is false.

    For your first example:

    if [ 1 ]
    then
       echo "Yes"
    else
       echo "No"
    fi
    

    "If" checks the exit code of the given command for true/false (i.e. zero/non-zero).

    The square brackets actually invoke the "test" command (see "man test" for more information) and give the exit code to if.

    "test 1" (or indeed "test any_string") returns true (0) so "Yes" is output.

    For your second example, this outputs "No" because "nuxi" isn't found in "Linux", if you change "nuxi" to "nux" (perhaps this was a typo?) and remove the spaces around the = then you will get the behaviour you expect. e.g.

    word=Linux
    letter=nux
    if echo "$word" | grep -q "$letter"
    then
        echo "Yes"
    else
        echo "No"
    fi
    
    0 讨论(0)
  • 2021-02-04 06:58

    The return value of a command is checked. [ 1 ] has a return value of 0 (true). Any other return value (like 1) indicates an error.

    You can display the return value of the last executed command using the $? variable:

    true
    echo $?
    # returned 0
    false
    echo $?
    # returned 1
    echo $?
    # returned 0 as the last executed command is 'echo', and not 'false'
    
    0 讨论(0)
  • 2021-02-04 06:58

    This is because the grep failed to find the $letter in $word, hence the exit code is 1. Whenever a process in linux return a code other than 0 then it means it failed. 0 means exited successfully. You can verify this by echo "Linux" | grep -d "nuxi"; echo $?

    On the other hand in scripting world 0 means false and 1 mean true. So the grep failed to find the word and send 1 as an exit code to if, which took it as a true value.

    0 讨论(0)
提交回复
热议问题