Exit statuses of comparisons in test constructsPOSIX test and -adifference between non-builtin 'test' and...

What is better: yes / no radio, or simple checkbox?

Calculate total length of edges in select Voronoi diagram

Does the US political system, in principle, allow for a no-party system?

Called into a meeting and told we are being made redundant (laid off) and "not to share outside". Can I tell my partner?

Faulty RAID1 disk now shows as foreign

What is the oldest European royal house?

Affine transformation of circular arc in 3D

Giving a talk in my old university, how prominently should I tell students my salary?

Why doesn't "adolescent" take any articles in "listen to adolescent agonising"?

Why would the IRS ask for birth certificates or even audit a small tax return?

What are Radio-location Services in the 1.9-2.0 MHz range?

Quitting employee has privileged access to critical information

Computing the volume of a simplex-like object with constraints

Iron deposits mined from under the city

Linear Combination of Atomic Orbitals

ESPP--any reason not to go all in?

Paper published similar to PhD thesis

Should we avoid writing fiction about historical events without extensive research?

If nine coins are tossed, what is the probability that the number of heads is even?

The (Easy) Road to Code

Why aren't there more gauls like Obelix?

Forcing Mathematica's Integrate to give more general answers

Deal the cards to the players

Where do you go through passport control when transiting through another Schengen airport on your way out of the Schengen area?



Exit statuses of comparisons in test constructs


POSIX test and -adifference between non-builtin 'test' and '['unix test when to use eq vs = vs == in test commands?What does `[ EXPRESSION ], [ ] and [OPTION` mean in `man test`?-n Vs !(exclamation mark) behaves differently with test commandDifference in conditions /test( test -n $st ) != ( test -z $st ) right?How to test list of proxy servers?Bash test: what does “=~” do?How to correctly test file's extension in if statement?













3















I was writing some "if then" statements and found what seemed to me an odd behavior. Upon investigation I realized that it boiled down to the exit code of the comparison I was making. I illustrate my findings in the following code snippet.



As you can see



rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"


Outputs



es_num is 1
es_str is 0


Is there any documentation, preferably from the POSIX standards, that talks about the difference in the exit statuses of -eq and = in a test construct?



What should I be aware of when writing conditional statements? What are some best practices regarding this?



Portable code is preferable to Bash code (which I'm using).










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

    – Elegance
    4 hours ago








  • 1





    The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

    – Kusalananda
    4 hours ago











  • @ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

    – Elegance
    2 hours ago













  • @Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

    – ilkkachu
    1 hour ago













  • @ilkkachu Thank you for the helpful feedback.

    – Elegance
    1 hour ago
















3















I was writing some "if then" statements and found what seemed to me an odd behavior. Upon investigation I realized that it boiled down to the exit code of the comparison I was making. I illustrate my findings in the following code snippet.



As you can see



rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"


Outputs



es_num is 1
es_str is 0


Is there any documentation, preferably from the POSIX standards, that talks about the difference in the exit statuses of -eq and = in a test construct?



What should I be aware of when writing conditional statements? What are some best practices regarding this?



Portable code is preferable to Bash code (which I'm using).










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

    – Elegance
    4 hours ago








  • 1





    The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

    – Kusalananda
    4 hours ago











  • @ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

    – Elegance
    2 hours ago













  • @Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

    – ilkkachu
    1 hour ago













  • @ilkkachu Thank you for the helpful feedback.

    – Elegance
    1 hour ago














3












3








3








I was writing some "if then" statements and found what seemed to me an odd behavior. Upon investigation I realized that it boiled down to the exit code of the comparison I was making. I illustrate my findings in the following code snippet.



As you can see



rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"


Outputs



es_num is 1
es_str is 0


Is there any documentation, preferably from the POSIX standards, that talks about the difference in the exit statuses of -eq and = in a test construct?



What should I be aware of when writing conditional statements? What are some best practices regarding this?



Portable code is preferable to Bash code (which I'm using).










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I was writing some "if then" statements and found what seemed to me an odd behavior. Upon investigation I realized that it boiled down to the exit code of the comparison I was making. I illustrate my findings in the following code snippet.



As you can see



rc=1
[ $rc -eq 0 ]
es_num=$?
[ $rc=0 ]
es_str=$?
echo "es_num is $es_num"
echo "es_str is $es_str"


Outputs



es_num is 1
es_str is 0


Is there any documentation, preferably from the POSIX standards, that talks about the difference in the exit statuses of -eq and = in a test construct?



What should I be aware of when writing conditional statements? What are some best practices regarding this?



Portable code is preferable to Bash code (which I'm using).







test control-flow






share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 2 hours ago







Elegance













New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 5 hours ago









EleganceElegance

183




183




New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.













  • I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

    – Elegance
    4 hours ago








  • 1





    The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

    – Kusalananda
    4 hours ago











  • @ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

    – Elegance
    2 hours ago













  • @Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

    – ilkkachu
    1 hour ago













  • @ilkkachu Thank you for the helpful feedback.

    – Elegance
    1 hour ago



















  • I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

    – Elegance
    4 hours ago








  • 1





    The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

    – Kusalananda
    4 hours ago











  • @ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

    – Elegance
    2 hours ago













  • @Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

    – ilkkachu
    1 hour ago













  • @ilkkachu Thank you for the helpful feedback.

    – Elegance
    1 hour ago

















I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

– Elegance
4 hours ago







I didn't know about the space being necessary. What I meant with "odd" is "weird if you read as pseudo code, ignoring the quirks of the language". Thanks. @ilkkachu

– Elegance
4 hours ago






1




1





The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

– Kusalananda
4 hours ago





The only way I can get [ $rc=0 ] to fail with rc=1 is to set IFS to 1 as well. That would cause both tests to error out and set $? to 2 (in bash).

– Kusalananda
4 hours ago













@ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

– Elegance
2 hours ago







@ilkkachu There was a typo. Of course I can't ignore them, but if I knew them, I wouldn't have to ask. That's exactly the point of the question.

– Elegance
2 hours ago















@Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

– ilkkachu
1 hour ago







@Elegance, ok, good, thanks. And yes, you're right, you wouldn't have to ask if you knew. It's just that even a typo like that can send the readers off in the wrong direction, looking for some really weird edge case that could explain the result. (The shell can be a bit quirky sometimes so there might have been a remote possibility of an edge case where both would return 1...)

– ilkkachu
1 hour ago















@ilkkachu Thank you for the helpful feedback.

– Elegance
1 hour ago





@ilkkachu Thank you for the helpful feedback.

– Elegance
1 hour ago










2 Answers
2






active

oldest

votes


















3














-eq




True if the integers n1 and n2 are algebraically equal; otherwise, false.




test



=




True if the strings s1 and s2 are identical; otherwise, false.




test



So -eq compares integers and = compares strings (which will also work with some limited integer cases).





You do have a syntax issue though, it should be:



[ "$rc" = 0 ]


And not



[ $rc=0 ]


[ "$rc" = 0 ] should exit with 1 because rc does not equal 0



[ $rc=0 ] should actually exit with 0 because it's likely going to be treated as a string and the presence of a string within the [ test construct will evaluate to true





With the sh [ test there are a few differences:



# leading 0
$ [ 01 -eq 1 ]; echo $?
0
# adjacent whitespace
$ [ ' 1' -eq 1 ]; echo $?
0
# negative 0 vs positive 0
$ [ 0 -eq -0 ]; echo $?
0


However with the bash [[ test there are a large number of differences (Including the ones mentioned above):



# base 8
$ [[ 032 -eq 26 ]]; echo $?
0
# Arithmetic expressions
$ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
0
# Base 64
$ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
0





share|improve this answer


























  • I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

    – Elegance
    4 hours ago













  • Any examples with strings that have nothing but digits, and don't have leading zeros?

    – Elegance
    4 hours ago






  • 1





    @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

    – Kusalananda
    3 hours ago








  • 1





    @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

    – Kusalananda
    3 hours ago













  • @Jesse_b You shared the same link twice. I take it the first one is incorrect.

    – Elegance
    1 hour ago



















0














For numeric comparisons you have to use -eq whereas = is for string comparisons (as from your variable naming you already seem to know).



One of the best introductions on the test aka [ command I know is The Unix Shell's Humble If






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',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });






    Elegance is a new contributor. Be nice, and check out our Code of Conduct.










    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504979%2fexit-statuses-of-comparisons-in-test-constructs%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    -eq




    True if the integers n1 and n2 are algebraically equal; otherwise, false.




    test



    =




    True if the strings s1 and s2 are identical; otherwise, false.




    test



    So -eq compares integers and = compares strings (which will also work with some limited integer cases).





    You do have a syntax issue though, it should be:



    [ "$rc" = 0 ]


    And not



    [ $rc=0 ]


    [ "$rc" = 0 ] should exit with 1 because rc does not equal 0



    [ $rc=0 ] should actually exit with 0 because it's likely going to be treated as a string and the presence of a string within the [ test construct will evaluate to true





    With the sh [ test there are a few differences:



    # leading 0
    $ [ 01 -eq 1 ]; echo $?
    0
    # adjacent whitespace
    $ [ ' 1' -eq 1 ]; echo $?
    0
    # negative 0 vs positive 0
    $ [ 0 -eq -0 ]; echo $?
    0


    However with the bash [[ test there are a large number of differences (Including the ones mentioned above):



    # base 8
    $ [[ 032 -eq 26 ]]; echo $?
    0
    # Arithmetic expressions
    $ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
    0
    # Base 64
    $ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
    0





    share|improve this answer


























    • I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

      – Elegance
      4 hours ago













    • Any examples with strings that have nothing but digits, and don't have leading zeros?

      – Elegance
      4 hours ago






    • 1





      @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

      – Kusalananda
      3 hours ago








    • 1





      @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

      – Kusalananda
      3 hours ago













    • @Jesse_b You shared the same link twice. I take it the first one is incorrect.

      – Elegance
      1 hour ago
















    3














    -eq




    True if the integers n1 and n2 are algebraically equal; otherwise, false.




    test



    =




    True if the strings s1 and s2 are identical; otherwise, false.




    test



    So -eq compares integers and = compares strings (which will also work with some limited integer cases).





    You do have a syntax issue though, it should be:



    [ "$rc" = 0 ]


    And not



    [ $rc=0 ]


    [ "$rc" = 0 ] should exit with 1 because rc does not equal 0



    [ $rc=0 ] should actually exit with 0 because it's likely going to be treated as a string and the presence of a string within the [ test construct will evaluate to true





    With the sh [ test there are a few differences:



    # leading 0
    $ [ 01 -eq 1 ]; echo $?
    0
    # adjacent whitespace
    $ [ ' 1' -eq 1 ]; echo $?
    0
    # negative 0 vs positive 0
    $ [ 0 -eq -0 ]; echo $?
    0


    However with the bash [[ test there are a large number of differences (Including the ones mentioned above):



    # base 8
    $ [[ 032 -eq 26 ]]; echo $?
    0
    # Arithmetic expressions
    $ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
    0
    # Base 64
    $ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
    0





    share|improve this answer


























    • I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

      – Elegance
      4 hours ago













    • Any examples with strings that have nothing but digits, and don't have leading zeros?

      – Elegance
      4 hours ago






    • 1





      @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

      – Kusalananda
      3 hours ago








    • 1





      @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

      – Kusalananda
      3 hours ago













    • @Jesse_b You shared the same link twice. I take it the first one is incorrect.

      – Elegance
      1 hour ago














    3












    3








    3







    -eq




    True if the integers n1 and n2 are algebraically equal; otherwise, false.




    test



    =




    True if the strings s1 and s2 are identical; otherwise, false.




    test



    So -eq compares integers and = compares strings (which will also work with some limited integer cases).





    You do have a syntax issue though, it should be:



    [ "$rc" = 0 ]


    And not



    [ $rc=0 ]


    [ "$rc" = 0 ] should exit with 1 because rc does not equal 0



    [ $rc=0 ] should actually exit with 0 because it's likely going to be treated as a string and the presence of a string within the [ test construct will evaluate to true





    With the sh [ test there are a few differences:



    # leading 0
    $ [ 01 -eq 1 ]; echo $?
    0
    # adjacent whitespace
    $ [ ' 1' -eq 1 ]; echo $?
    0
    # negative 0 vs positive 0
    $ [ 0 -eq -0 ]; echo $?
    0


    However with the bash [[ test there are a large number of differences (Including the ones mentioned above):



    # base 8
    $ [[ 032 -eq 26 ]]; echo $?
    0
    # Arithmetic expressions
    $ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
    0
    # Base 64
    $ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
    0





    share|improve this answer















    -eq




    True if the integers n1 and n2 are algebraically equal; otherwise, false.




    test



    =




    True if the strings s1 and s2 are identical; otherwise, false.




    test



    So -eq compares integers and = compares strings (which will also work with some limited integer cases).





    You do have a syntax issue though, it should be:



    [ "$rc" = 0 ]


    And not



    [ $rc=0 ]


    [ "$rc" = 0 ] should exit with 1 because rc does not equal 0



    [ $rc=0 ] should actually exit with 0 because it's likely going to be treated as a string and the presence of a string within the [ test construct will evaluate to true





    With the sh [ test there are a few differences:



    # leading 0
    $ [ 01 -eq 1 ]; echo $?
    0
    # adjacent whitespace
    $ [ ' 1' -eq 1 ]; echo $?
    0
    # negative 0 vs positive 0
    $ [ 0 -eq -0 ]; echo $?
    0


    However with the bash [[ test there are a large number of differences (Including the ones mentioned above):



    # base 8
    $ [[ 032 -eq 26 ]]; echo $?
    0
    # Arithmetic expressions
    $ [[ 1*6+32/15*2-1 -eq 9 ]]; echo $?
    0
    # Base 64
    $ [[ 64#Hello_world -eq -5506400892957379251 ]]; echo $?
    0






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 3 hours ago

























    answered 4 hours ago









    Jesse_bJesse_b

    13.2k23369




    13.2k23369













    • I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

      – Elegance
      4 hours ago













    • Any examples with strings that have nothing but digits, and don't have leading zeros?

      – Elegance
      4 hours ago






    • 1





      @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

      – Kusalananda
      3 hours ago








    • 1





      @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

      – Kusalananda
      3 hours ago













    • @Jesse_b You shared the same link twice. I take it the first one is incorrect.

      – Elegance
      1 hour ago



















    • I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

      – Elegance
      4 hours ago













    • Any examples with strings that have nothing but digits, and don't have leading zeros?

      – Elegance
      4 hours ago






    • 1





      @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

      – Kusalananda
      3 hours ago








    • 1





      @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

      – Kusalananda
      3 hours ago













    • @Jesse_b You shared the same link twice. I take it the first one is incorrect.

      – Elegance
      1 hour ago

















    I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

    – Elegance
    4 hours ago







    I'm just a bit confused about what is meant by numeric and string comparisons. Let's say I use = to compare numbers. When is it not going to not yield the same result as a numeric comparison?

    – Elegance
    4 hours ago















    Any examples with strings that have nothing but digits, and don't have leading zeros?

    – Elegance
    4 hours ago





    Any examples with strings that have nothing but digits, and don't have leading zeros?

    – Elegance
    4 hours ago




    1




    1





    @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

    – Kusalananda
    3 hours ago







    @Elegance The point is that with -eq, the left and right hand side are compared as integers, not as strings. The test would evaluate the strings as integers (probably by passing them through strtol() or some such C function) before carrying out the comparison.

    – Kusalananda
    3 hours ago






    1




    1





    @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

    – Kusalananda
    3 hours ago







    @Elegance In a bash test with [[ ... -eq ... ]] you could even have arithmetic calculations on either side, as in [[ 1+1 -eq 2 ]]. Obviously, [[ 1+1 == 2 ]] would not be true.

    – Kusalananda
    3 hours ago















    @Jesse_b You shared the same link twice. I take it the first one is incorrect.

    – Elegance
    1 hour ago





    @Jesse_b You shared the same link twice. I take it the first one is incorrect.

    – Elegance
    1 hour ago













    0














    For numeric comparisons you have to use -eq whereas = is for string comparisons (as from your variable naming you already seem to know).



    One of the best introductions on the test aka [ command I know is The Unix Shell's Humble If






    share|improve this answer




























      0














      For numeric comparisons you have to use -eq whereas = is for string comparisons (as from your variable naming you already seem to know).



      One of the best introductions on the test aka [ command I know is The Unix Shell's Humble If






      share|improve this answer


























        0












        0








        0







        For numeric comparisons you have to use -eq whereas = is for string comparisons (as from your variable naming you already seem to know).



        One of the best introductions on the test aka [ command I know is The Unix Shell's Humble If






        share|improve this answer













        For numeric comparisons you have to use -eq whereas = is for string comparisons (as from your variable naming you already seem to know).



        One of the best introductions on the test aka [ command I know is The Unix Shell's Humble If







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 4 hours ago









        freiheitsnetzfreiheitsnetz

        112




        112






















            Elegance is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            Elegance is a new contributor. Be nice, and check out our Code of Conduct.













            Elegance is a new contributor. Be nice, and check out our Code of Conduct.












            Elegance is a new contributor. Be nice, and check out our Code of Conduct.
















            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504979%2fexit-statuses-of-comparisons-in-test-constructs%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown