How to compare strings in Bash

前端 未结 10 1749
眼角桃花
眼角桃花 2020-11-22 02:48

How do I compare a variable to a string (and do something if they match)?

相关标签:
10条回答
  • 2020-11-22 03:22

    To compare strings with wildcards use

    if [[ "$stringA" == *$stringB* ]]; then
      # Do something here
    else
      # Do Something here
    fi
    
    0 讨论(0)
  • 2020-11-22 03:25

    I have to disagree one of the comments in one point:

    [ "$x" == "valid" ] && echo "valid" || echo "invalid"
    

    No, that is not a crazy oneliner

    It's just it looks like one to, hmm, the uninitiated...

    It uses common patterns as a language, in a way;

    And after you learned the language.

    Actually, it's nice to read

    It is a simple logical expression, with one special part: lazy evaluation of the logic operators.

    [ "$x" == "valid" ] && echo "valid" || echo "invalid"
    

    Each part is a logical expression; the first may be true or false, the other two are always true.

    (
    [ "$x" == "valid" ] 
    &&
    echo "valid"
    )
    ||
    echo "invalid"
    

    Now, when it is evaluated, the first is checked. If it is false, than the second operand of the logic and && after it is not relevant. The first is not true, so it can not be the first and the second be true, anyway.
    Now, in this case is the the first side of the logic or || false, but it could be true if the other side - the third part - is true.

    So the third part will be evaluated - mainly writing the message as a side effect. (It has the result 0 for true, which we do not use here)

    The other cases are similar, but simpler - and - I promise! are - can be - easy to read!
    (I don't have one, but I think being a UNIX veteran with grey beard helps a lot with this.)

    0 讨论(0)
  • 2020-11-22 03:28

    I would probably use regexp matches if the input has only a few valid entries. E.g. only the "start" and "stop" are valid actions.

    if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
      echo "valid action"
    fi
    

    Note that I lowercase the variable $ACTION by using the double comma's. Also note that this won't work on too aged bash versions out there.

    0 讨论(0)
  • 2020-11-22 03:31

    Using variables in if statements

    if [ "$x" = "valid" ]; then
      echo "x has the value 'valid'"
    fi
    

    If you want to do something when they don't match, replace = with !=. You can read more about string operations and arithmetic operations in their respective documentation.

    Why do we use quotes around $x?

    You want the quotes around $x, because if it is empty, your Bash script encounters a syntax error as seen below:

    if [ = "valid" ]; then
    

    Non-standard use of == operator

    Note that Bash allows == to be used for equality with [, but this is not standard.

    Use either the first case wherein the quotes around $x are optional:

    if [[ "$x" == "valid" ]]; then
    

    or use the second case:

    if [ "$x" = "valid" ]; then
    
    0 讨论(0)
  • 2020-11-22 03:33

    Bash 4+ examples. Note: not using quotes will cause issues when words contain spaces, etc. Always quote in Bash, IMO.

    Here are some examples in Bash 4+:

    Example 1, check for 'yes' in string (case insensitive):

        if [[ "${str,,}" == *"yes"* ]] ;then
    

    Example 2, check for 'yes' in string (case insensitive):

        if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
    

    Example 3, check for 'yes' in string (case sensitive):

         if [[ "${str}" == *"yes"* ]] ;then
    

    Example 4, check for 'yes' in string (case sensitive):

         if [[ "${str}" =~ "yes" ]] ;then
    

    Example 5, exact match (case sensitive):

         if [[ "${str}" == "yes" ]] ;then
    

    Example 6, exact match (case insensitive):

         if [[ "${str,,}" == "yes" ]] ;then
    

    Example 7, exact match:

         if [ "$a" = "$b" ] ;then
    

    Enjoy.

    0 讨论(0)
  • 2020-11-22 03:34

    I did it in this way that is compatible with Bash and Dash (sh):

    testOutput="my test"
    pattern="my"
    
    case $testOutput in (*"$pattern"*)
        echo "if there is a match"
        exit 1
        ;;
    (*)
       ! echo there is no coincidence!
    ;;esac
    
    0 讨论(0)
提交回复
热议问题