Comparing two strings in Bash

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
23
down vote

favorite
3












I have the following if block in my bash script:



if [ $PACKAGENAME -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi


The script execution is not entering my if block even though $PACKAGENAME is equal to kakadu-v6_4-00902C. What am I doing wrong?







share|improve this question


















  • 9




    -eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
    – jasonwryan
    Jul 17 '14 at 18:11










  • Thanks jasonwryan I'll take a look at this resource!
    – DemiSheep
    Jul 17 '14 at 18:21














up vote
23
down vote

favorite
3












I have the following if block in my bash script:



if [ $PACKAGENAME -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi


The script execution is not entering my if block even though $PACKAGENAME is equal to kakadu-v6_4-00902C. What am I doing wrong?







share|improve this question


















  • 9




    -eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
    – jasonwryan
    Jul 17 '14 at 18:11










  • Thanks jasonwryan I'll take a look at this resource!
    – DemiSheep
    Jul 17 '14 at 18:21












up vote
23
down vote

favorite
3









up vote
23
down vote

favorite
3






3





I have the following if block in my bash script:



if [ $PACKAGENAME -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi


The script execution is not entering my if block even though $PACKAGENAME is equal to kakadu-v6_4-00902C. What am I doing wrong?







share|improve this question














I have the following if block in my bash script:



if [ $PACKAGENAME -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi


The script execution is not entering my if block even though $PACKAGENAME is equal to kakadu-v6_4-00902C. What am I doing wrong?









share|improve this question













share|improve this question




share|improve this question








edited Jul 18 '14 at 10:16









professorfish

1032




1032










asked Jul 17 '14 at 18:07









DemiSheep

4864821




4864821







  • 9




    -eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
    – jasonwryan
    Jul 17 '14 at 18:11










  • Thanks jasonwryan I'll take a look at this resource!
    – DemiSheep
    Jul 17 '14 at 18:21












  • 9




    -eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
    – jasonwryan
    Jul 17 '14 at 18:11










  • Thanks jasonwryan I'll take a look at this resource!
    – DemiSheep
    Jul 17 '14 at 18:21







9




9




-eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
– jasonwryan
Jul 17 '14 at 18:11




-eq is true for integers, you want to test for a string or regex (== or =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
– jasonwryan
Jul 17 '14 at 18:11












Thanks jasonwryan I'll take a look at this resource!
– DemiSheep
Jul 17 '14 at 18:21




Thanks jasonwryan I'll take a look at this resource!
– DemiSheep
Jul 17 '14 at 18:21










3 Answers
3






active

oldest

votes

















up vote
32
down vote



accepted










-eq is an arithmetic operator, which compares two numbers.



Use = (portable/standard sh), =~ or == instead.



Also use quotes, because if $PACKAGENAME contains a whitespace or wildcard character, then it will be split into multiple arguments, which causes to make [ see more arguments than desired. See here a list of common bash pitfalls.



if [ "$PACKAGENAME" = 'kakadu-v6_4-00902C' ]; then
echo "successfully entered if block!!"
fi


See man bash, search (/) for CONDITIONAL EXPRESSIONS.






share|improve this answer


















  • 1




    Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
    – DemiSheep
    Jul 17 '14 at 18:16






  • 2




    Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
    – polym
    Jul 17 '14 at 18:17






  • 1




    Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
    – DemiSheep
    Jul 17 '14 at 18:18







  • 4




    Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
    – glenn jackman
    Jul 17 '14 at 19:12






  • 4




    @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
    – Gilles
    Jul 17 '14 at 22:12

















up vote
7
down vote













Replace -eq with == so your if block would be this:-



if [ $PACKAGENAME == kakadu-v6_4-00902C ]; then

echo "successfully entered if block!!"

fi





share|improve this answer
















  • 5




    Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
    – polym
    Jul 17 '14 at 18:23










  • @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
    – beginer
    Jul 18 '14 at 5:34


















up vote
4
down vote













Another way is to negate them:



: $PACKAGENAME:?'$PACKAGENAME variable is empty!' #emits error and exits
[ -z "$PACKAGENAME#kakadu-v6_4-00902C" ] || #if var - str not empty do block
echo '$PACKAGENAME is not kakadu-v6_4-00902C'
exit 1
>&2


The above block first tests if "$PACKAGENAME" has any value at all, and, if not it exits with error and echoes ?'this'} to stderr. If its parent shell still exists then the test has passed, and it next tests if removing your 'kakadu...' string from the variable results in an -z empty string. If it does not, then it again emits an error and exits the shell. If your shell still exists at this point anything after the block is executed, otherwise it is not.



Probably this sort of thing is best implemented in a function. Like:



argeq() ( i= : $2?^MERR: not enough parameters! #$#>=2 || quit w/ err ^M == r
z() return $(($#1>0)) ; #return 1 if $#1>0 else 0
until z "$2+?" $((i=i+1)) #until $2 is not set...
do ! z "$1" && z "$1#"$2"" || #$1 != '' && $1 - $2 == '' or...
exit $((i$1:++1)) #exit $? == failed arg count
shift ; done #shift away one param ; continue loop
)


With that function you can provide as many arguments as your system will allow. If you provide fewer than 2 it will return 1 and emit a message to stderr. If you provide 2 or more arguments it will treat all as strings and return 0 if all are identical and not null else it will return the argument number which first fails the check.



In your case it can be used like:





###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C


To demonstrate further I'll write another function:



aeqecho() #save $?; ! exclusive 


DEMO:



 i= s=string
aeqecho $s #1
aeqecho $s $s #2
aeqecho "$s $s" #3
aeqecho "$s $s" "$s string" #4
aeqecho "$s1" $s string #5
aeqecho "" "" "" #6
aeqecho "" "$s" $s #7
aeqecho 1 "$s#$s1" $((2-1)) #8
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10



OUTPUT:



ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay





share|improve this answer






















    Your Answer







    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "106"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    convertImagesToLinks: false,
    noModals: false,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













     

    draft saved


    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f145160%2fcomparing-two-strings-in-bash%23new-answer', 'question_page');

    );

    Post as a guest






























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    32
    down vote



    accepted










    -eq is an arithmetic operator, which compares two numbers.



    Use = (portable/standard sh), =~ or == instead.



    Also use quotes, because if $PACKAGENAME contains a whitespace or wildcard character, then it will be split into multiple arguments, which causes to make [ see more arguments than desired. See here a list of common bash pitfalls.



    if [ "$PACKAGENAME" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
    fi


    See man bash, search (/) for CONDITIONAL EXPRESSIONS.






    share|improve this answer


















    • 1




      Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
      – DemiSheep
      Jul 17 '14 at 18:16






    • 2




      Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
      – polym
      Jul 17 '14 at 18:17






    • 1




      Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
      – DemiSheep
      Jul 17 '14 at 18:18







    • 4




      Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
      – glenn jackman
      Jul 17 '14 at 19:12






    • 4




      @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
      – Gilles
      Jul 17 '14 at 22:12














    up vote
    32
    down vote



    accepted










    -eq is an arithmetic operator, which compares two numbers.



    Use = (portable/standard sh), =~ or == instead.



    Also use quotes, because if $PACKAGENAME contains a whitespace or wildcard character, then it will be split into multiple arguments, which causes to make [ see more arguments than desired. See here a list of common bash pitfalls.



    if [ "$PACKAGENAME" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
    fi


    See man bash, search (/) for CONDITIONAL EXPRESSIONS.






    share|improve this answer


















    • 1




      Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
      – DemiSheep
      Jul 17 '14 at 18:16






    • 2




      Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
      – polym
      Jul 17 '14 at 18:17






    • 1




      Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
      – DemiSheep
      Jul 17 '14 at 18:18







    • 4




      Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
      – glenn jackman
      Jul 17 '14 at 19:12






    • 4




      @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
      – Gilles
      Jul 17 '14 at 22:12












    up vote
    32
    down vote



    accepted







    up vote
    32
    down vote



    accepted






    -eq is an arithmetic operator, which compares two numbers.



    Use = (portable/standard sh), =~ or == instead.



    Also use quotes, because if $PACKAGENAME contains a whitespace or wildcard character, then it will be split into multiple arguments, which causes to make [ see more arguments than desired. See here a list of common bash pitfalls.



    if [ "$PACKAGENAME" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
    fi


    See man bash, search (/) for CONDITIONAL EXPRESSIONS.






    share|improve this answer














    -eq is an arithmetic operator, which compares two numbers.



    Use = (portable/standard sh), =~ or == instead.



    Also use quotes, because if $PACKAGENAME contains a whitespace or wildcard character, then it will be split into multiple arguments, which causes to make [ see more arguments than desired. See here a list of common bash pitfalls.



    if [ "$PACKAGENAME" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
    fi


    See man bash, search (/) for CONDITIONAL EXPRESSIONS.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Aug 11 '14 at 7:30









    Stéphane Chazelas

    283k53521855




    283k53521855










    answered Jul 17 '14 at 18:11









    polym

    6,29643155




    6,29643155







    • 1




      Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
      – DemiSheep
      Jul 17 '14 at 18:16






    • 2




      Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
      – polym
      Jul 17 '14 at 18:17






    • 1




      Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
      – DemiSheep
      Jul 17 '14 at 18:18







    • 4




      Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
      – glenn jackman
      Jul 17 '14 at 19:12






    • 4




      @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
      – Gilles
      Jul 17 '14 at 22:12












    • 1




      Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
      – DemiSheep
      Jul 17 '14 at 18:16






    • 2




      Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
      – polym
      Jul 17 '14 at 18:17






    • 1




      Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
      – DemiSheep
      Jul 17 '14 at 18:18







    • 4




      Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
      – glenn jackman
      Jul 17 '14 at 19:12






    • 4




      @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
      – Gilles
      Jul 17 '14 at 22:12







    1




    1




    Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
    – DemiSheep
    Jul 17 '14 at 18:16




    Ah! Thank you! It worked! I am obviously a rookie at this. I'm grateful for your help!
    – DemiSheep
    Jul 17 '14 at 18:16




    2




    2




    Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
    – polym
    Jul 17 '14 at 18:17




    Have you had a look at tldp.org/LDP/Bash-Beginners-Guide/html ? It's a very nice bash guide and will help you with examples and exams :).
    – polym
    Jul 17 '14 at 18:17




    1




    1




    Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
    – DemiSheep
    Jul 17 '14 at 18:18





    Thanks polym I'll take a look, thanks for the resource! I'll open that tab up next to my VI guide. :)
    – DemiSheep
    Jul 17 '14 at 18:18





    4




    4




    Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
    – glenn jackman
    Jul 17 '14 at 19:12




    Within double brackets, no word splitting is done, so [[ $PACKAGENAME == "kakadu..." ]] is OK.
    – glenn jackman
    Jul 17 '14 at 19:12




    4




    4




    @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
    – Gilles
    Jul 17 '14 at 22:12




    @glennjackman Beware however that even within double brackets, you need double quotes around variable expansions on the right-hand side of =, == and !=, because that side is a pattern, not a string. For example, foo='*'; [[ whatever = $foo ]] is true.
    – Gilles
    Jul 17 '14 at 22:12












    up vote
    7
    down vote













    Replace -eq with == so your if block would be this:-



    if [ $PACKAGENAME == kakadu-v6_4-00902C ]; then

    echo "successfully entered if block!!"

    fi





    share|improve this answer
















    • 5




      Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
      – polym
      Jul 17 '14 at 18:23










    • @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
      – beginer
      Jul 18 '14 at 5:34















    up vote
    7
    down vote













    Replace -eq with == so your if block would be this:-



    if [ $PACKAGENAME == kakadu-v6_4-00902C ]; then

    echo "successfully entered if block!!"

    fi





    share|improve this answer
















    • 5




      Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
      – polym
      Jul 17 '14 at 18:23










    • @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
      – beginer
      Jul 18 '14 at 5:34













    up vote
    7
    down vote










    up vote
    7
    down vote









    Replace -eq with == so your if block would be this:-



    if [ $PACKAGENAME == kakadu-v6_4-00902C ]; then

    echo "successfully entered if block!!"

    fi





    share|improve this answer












    Replace -eq with == so your if block would be this:-



    if [ $PACKAGENAME == kakadu-v6_4-00902C ]; then

    echo "successfully entered if block!!"

    fi






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Jul 17 '14 at 18:17









    beginer

    1,9181016




    1,9181016







    • 5




      Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
      – polym
      Jul 17 '14 at 18:23










    • @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
      – beginer
      Jul 18 '14 at 5:34













    • 5




      Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
      – polym
      Jul 17 '14 at 18:23










    • @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
      – beginer
      Jul 18 '14 at 5:34








    5




    5




    Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
    – polym
    Jul 17 '14 at 18:23




    Don't forget quoting! Have a look here, why: mywiki.wooledge.org/BashPitfalls#A.5B_.24foo_.3D_.22bar.22_.5D
    – polym
    Jul 17 '14 at 18:23












    @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
    – beginer
    Jul 18 '14 at 5:34





    @polym hey thanks, but I just gave the minimalist version that was working ;) :D .
    – beginer
    Jul 18 '14 at 5:34











    up vote
    4
    down vote













    Another way is to negate them:



    : $PACKAGENAME:?'$PACKAGENAME variable is empty!' #emits error and exits
    [ -z "$PACKAGENAME#kakadu-v6_4-00902C" ] || #if var - str not empty do block
    echo '$PACKAGENAME is not kakadu-v6_4-00902C'
    exit 1
    >&2


    The above block first tests if "$PACKAGENAME" has any value at all, and, if not it exits with error and echoes ?'this'} to stderr. If its parent shell still exists then the test has passed, and it next tests if removing your 'kakadu...' string from the variable results in an -z empty string. If it does not, then it again emits an error and exits the shell. If your shell still exists at this point anything after the block is executed, otherwise it is not.



    Probably this sort of thing is best implemented in a function. Like:



    argeq() ( i= : $2?^MERR: not enough parameters! #$#>=2 || quit w/ err ^M == r
    z() return $(($#1>0)) ; #return 1 if $#1>0 else 0
    until z "$2+?" $((i=i+1)) #until $2 is not set...
    do ! z "$1" && z "$1#"$2"" || #$1 != '' && $1 - $2 == '' or...
    exit $((i$1:++1)) #exit $? == failed arg count
    shift ; done #shift away one param ; continue loop
    )


    With that function you can provide as many arguments as your system will allow. If you provide fewer than 2 it will return 1 and emit a message to stderr. If you provide 2 or more arguments it will treat all as strings and return 0 if all are identical and not null else it will return the argument number which first fails the check.



    In your case it can be used like:





    ###OUTPUT###
    kakadu-v6_4-00902C == kakadu-v6_4-00902C
    kakadu-v6_4-00902C != v6_4-00902C


    To demonstrate further I'll write another function:



    aeqecho() #save $?; ! exclusive 


    DEMO:



     i= s=string
    aeqecho $s #1
    aeqecho $s $s #2
    aeqecho "$s $s" #3
    aeqecho "$s $s" "$s string" #4
    aeqecho "$s1" $s string #5
    aeqecho "" "" "" #6
    aeqecho "" "$s" $s #7
    aeqecho 1 "$s#$s1" $((2-1)) #8
    aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
    aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10



    OUTPUT:



    ERR: not enough parameters!
    2 : yay
    ERR: not enough parameters!
    4 : yay
    5 : shite - arg2 failed
    6 : shite - arg1 failed
    7 : shite - arg1 failed
    8 : yay
    9 : shite - arg13 failed
    10 : yay





    share|improve this answer


























      up vote
      4
      down vote













      Another way is to negate them:



      : $PACKAGENAME:?'$PACKAGENAME variable is empty!' #emits error and exits
      [ -z "$PACKAGENAME#kakadu-v6_4-00902C" ] || #if var - str not empty do block
      echo '$PACKAGENAME is not kakadu-v6_4-00902C'
      exit 1
      >&2


      The above block first tests if "$PACKAGENAME" has any value at all, and, if not it exits with error and echoes ?'this'} to stderr. If its parent shell still exists then the test has passed, and it next tests if removing your 'kakadu...' string from the variable results in an -z empty string. If it does not, then it again emits an error and exits the shell. If your shell still exists at this point anything after the block is executed, otherwise it is not.



      Probably this sort of thing is best implemented in a function. Like:



      argeq() ( i= : $2?^MERR: not enough parameters! #$#>=2 || quit w/ err ^M == r
      z() return $(($#1>0)) ; #return 1 if $#1>0 else 0
      until z "$2+?" $((i=i+1)) #until $2 is not set...
      do ! z "$1" && z "$1#"$2"" || #$1 != '' && $1 - $2 == '' or...
      exit $((i$1:++1)) #exit $? == failed arg count
      shift ; done #shift away one param ; continue loop
      )


      With that function you can provide as many arguments as your system will allow. If you provide fewer than 2 it will return 1 and emit a message to stderr. If you provide 2 or more arguments it will treat all as strings and return 0 if all are identical and not null else it will return the argument number which first fails the check.



      In your case it can be used like:





      ###OUTPUT###
      kakadu-v6_4-00902C == kakadu-v6_4-00902C
      kakadu-v6_4-00902C != v6_4-00902C


      To demonstrate further I'll write another function:



      aeqecho() #save $?; ! exclusive 


      DEMO:



       i= s=string
      aeqecho $s #1
      aeqecho $s $s #2
      aeqecho "$s $s" #3
      aeqecho "$s $s" "$s string" #4
      aeqecho "$s1" $s string #5
      aeqecho "" "" "" #6
      aeqecho "" "$s" $s #7
      aeqecho 1 "$s#$s1" $((2-1)) #8
      aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
      aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10



      OUTPUT:



      ERR: not enough parameters!
      2 : yay
      ERR: not enough parameters!
      4 : yay
      5 : shite - arg2 failed
      6 : shite - arg1 failed
      7 : shite - arg1 failed
      8 : yay
      9 : shite - arg13 failed
      10 : yay





      share|improve this answer
























        up vote
        4
        down vote










        up vote
        4
        down vote









        Another way is to negate them:



        : $PACKAGENAME:?'$PACKAGENAME variable is empty!' #emits error and exits
        [ -z "$PACKAGENAME#kakadu-v6_4-00902C" ] || #if var - str not empty do block
        echo '$PACKAGENAME is not kakadu-v6_4-00902C'
        exit 1
        >&2


        The above block first tests if "$PACKAGENAME" has any value at all, and, if not it exits with error and echoes ?'this'} to stderr. If its parent shell still exists then the test has passed, and it next tests if removing your 'kakadu...' string from the variable results in an -z empty string. If it does not, then it again emits an error and exits the shell. If your shell still exists at this point anything after the block is executed, otherwise it is not.



        Probably this sort of thing is best implemented in a function. Like:



        argeq() ( i= : $2?^MERR: not enough parameters! #$#>=2 || quit w/ err ^M == r
        z() return $(($#1>0)) ; #return 1 if $#1>0 else 0
        until z "$2+?" $((i=i+1)) #until $2 is not set...
        do ! z "$1" && z "$1#"$2"" || #$1 != '' && $1 - $2 == '' or...
        exit $((i$1:++1)) #exit $? == failed arg count
        shift ; done #shift away one param ; continue loop
        )


        With that function you can provide as many arguments as your system will allow. If you provide fewer than 2 it will return 1 and emit a message to stderr. If you provide 2 or more arguments it will treat all as strings and return 0 if all are identical and not null else it will return the argument number which first fails the check.



        In your case it can be used like:





        ###OUTPUT###
        kakadu-v6_4-00902C == kakadu-v6_4-00902C
        kakadu-v6_4-00902C != v6_4-00902C


        To demonstrate further I'll write another function:



        aeqecho() #save $?; ! exclusive 


        DEMO:



         i= s=string
        aeqecho $s #1
        aeqecho $s $s #2
        aeqecho "$s $s" #3
        aeqecho "$s $s" "$s string" #4
        aeqecho "$s1" $s string #5
        aeqecho "" "" "" #6
        aeqecho "" "$s" $s #7
        aeqecho 1 "$s#$s1" $((2-1)) #8
        aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
        aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10



        OUTPUT:



        ERR: not enough parameters!
        2 : yay
        ERR: not enough parameters!
        4 : yay
        5 : shite - arg2 failed
        6 : shite - arg1 failed
        7 : shite - arg1 failed
        8 : yay
        9 : shite - arg13 failed
        10 : yay





        share|improve this answer














        Another way is to negate them:



        : $PACKAGENAME:?'$PACKAGENAME variable is empty!' #emits error and exits
        [ -z "$PACKAGENAME#kakadu-v6_4-00902C" ] || #if var - str not empty do block
        echo '$PACKAGENAME is not kakadu-v6_4-00902C'
        exit 1
        >&2


        The above block first tests if "$PACKAGENAME" has any value at all, and, if not it exits with error and echoes ?'this'} to stderr. If its parent shell still exists then the test has passed, and it next tests if removing your 'kakadu...' string from the variable results in an -z empty string. If it does not, then it again emits an error and exits the shell. If your shell still exists at this point anything after the block is executed, otherwise it is not.



        Probably this sort of thing is best implemented in a function. Like:



        argeq() ( i= : $2?^MERR: not enough parameters! #$#>=2 || quit w/ err ^M == r
        z() return $(($#1>0)) ; #return 1 if $#1>0 else 0
        until z "$2+?" $((i=i+1)) #until $2 is not set...
        do ! z "$1" && z "$1#"$2"" || #$1 != '' && $1 - $2 == '' or...
        exit $((i$1:++1)) #exit $? == failed arg count
        shift ; done #shift away one param ; continue loop
        )


        With that function you can provide as many arguments as your system will allow. If you provide fewer than 2 it will return 1 and emit a message to stderr. If you provide 2 or more arguments it will treat all as strings and return 0 if all are identical and not null else it will return the argument number which first fails the check.



        In your case it can be used like:





        ###OUTPUT###
        kakadu-v6_4-00902C == kakadu-v6_4-00902C
        kakadu-v6_4-00902C != v6_4-00902C


        To demonstrate further I'll write another function:



        aeqecho() #save $?; ! exclusive 


        DEMO:



         i= s=string
        aeqecho $s #1
        aeqecho $s $s #2
        aeqecho "$s $s" #3
        aeqecho "$s $s" "$s string" #4
        aeqecho "$s1" $s string #5
        aeqecho "" "" "" #6
        aeqecho "" "$s" $s #7
        aeqecho 1 "$s#$s1" $((2-1)) #8
        aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
        aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10



        OUTPUT:



        ERR: not enough parameters!
        2 : yay
        ERR: not enough parameters!
        4 : yay
        5 : shite - arg2 failed
        6 : shite - arg1 failed
        7 : shite - arg1 failed
        8 : yay
        9 : shite - arg13 failed
        10 : yay






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Jul 21 '14 at 21:13

























        answered Jul 17 '14 at 18:24









        mikeserv

        44.2k564150




        44.2k564150



























             

            draft saved


            draft discarded















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f145160%2fcomparing-two-strings-in-bash%23new-answer', 'question_page');

            );

            Post as a guest













































































            Popular posts from this blog

            How to check contact read email or not when send email to Individual?

            Displaying single band from multi-band raster using QGIS

            How many registers does an x86_64 CPU actually have?