Why is this string matching condition in [[ ]] not true?












0














$ tpgid=$(ps  --no-headers -o tpgid -p 1)
$ echo $tpgid
-1
$ if [[ $tpgid == "-1" ]]; then
> echo "yes"
> else
> echo "no"
> fi
no


Why is the condition not true? Thanks.



$ printf "%s" "$tpgid" > /tmp/test/fff
$ hd /tmp/test/fff
00000000 20 20 20 2d 31 | -1|
00000005









share|improve this question




















  • 5




    always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
    – Jeff Schaller
    Dec 31 '18 at 18:05


















0














$ tpgid=$(ps  --no-headers -o tpgid -p 1)
$ echo $tpgid
-1
$ if [[ $tpgid == "-1" ]]; then
> echo "yes"
> else
> echo "no"
> fi
no


Why is the condition not true? Thanks.



$ printf "%s" "$tpgid" > /tmp/test/fff
$ hd /tmp/test/fff
00000000 20 20 20 2d 31 | -1|
00000005









share|improve this question




















  • 5




    always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
    – Jeff Schaller
    Dec 31 '18 at 18:05
















0












0








0







$ tpgid=$(ps  --no-headers -o tpgid -p 1)
$ echo $tpgid
-1
$ if [[ $tpgid == "-1" ]]; then
> echo "yes"
> else
> echo "no"
> fi
no


Why is the condition not true? Thanks.



$ printf "%s" "$tpgid" > /tmp/test/fff
$ hd /tmp/test/fff
00000000 20 20 20 2d 31 | -1|
00000005









share|improve this question















$ tpgid=$(ps  --no-headers -o tpgid -p 1)
$ echo $tpgid
-1
$ if [[ $tpgid == "-1" ]]; then
> echo "yes"
> else
> echo "no"
> fi
no


Why is the condition not true? Thanks.



$ printf "%s" "$tpgid" > /tmp/test/fff
$ hd /tmp/test/fff
00000000 20 20 20 2d 31 | -1|
00000005






bash






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 31 '18 at 17:41







Tim

















asked Dec 31 '18 at 17:31









TimTim

26.3k74246455




26.3k74246455








  • 5




    always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
    – Jeff Schaller
    Dec 31 '18 at 18:05
















  • 5




    always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
    – Jeff Schaller
    Dec 31 '18 at 18:05










5




5




always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
– Jeff Schaller
Dec 31 '18 at 18:05






always quote your variables ... then you'd see the spaces in front of the -1, as DopeGhoti pointed out
– Jeff Schaller
Dec 31 '18 at 18:05












2 Answers
2






active

oldest

votes


















8














Even though [[ ... ]] is "smarter" than [ ... ] or test ..., it's still a better idea to explicitly use numerical comparison operators:



if [[ "$tpgid" -eq -1 ]]; then ...


Further, your hexdump:



$ hd /tmp/test/fff
00000000 20 20 20 2d 31 | -1|


shows that $tpgid expands to " -1", not "-1"; -eq knows how to handle this, while == is rightly doing a string comparison:



$ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
falsy
$ if [[ " -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
truthy


In short, the string matching condition is not returning true because the strings in fact do not match.






share|improve this answer































    4














    Most likely is that $tpgid contains leading and/or trailing whitespace. Since the value is numeric, you might want to use an arithmetic expression:



    if (( tpgid == -1 )); then ...





    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
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f491793%2fwhy-is-this-string-matching-condition-in-not-true%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









      8














      Even though [[ ... ]] is "smarter" than [ ... ] or test ..., it's still a better idea to explicitly use numerical comparison operators:



      if [[ "$tpgid" -eq -1 ]]; then ...


      Further, your hexdump:



      $ hd /tmp/test/fff
      00000000 20 20 20 2d 31 | -1|


      shows that $tpgid expands to " -1", not "-1"; -eq knows how to handle this, while == is rightly doing a string comparison:



      $ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
      falsy
      $ if [[ " -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
      truthy


      In short, the string matching condition is not returning true because the strings in fact do not match.






      share|improve this answer




























        8














        Even though [[ ... ]] is "smarter" than [ ... ] or test ..., it's still a better idea to explicitly use numerical comparison operators:



        if [[ "$tpgid" -eq -1 ]]; then ...


        Further, your hexdump:



        $ hd /tmp/test/fff
        00000000 20 20 20 2d 31 | -1|


        shows that $tpgid expands to " -1", not "-1"; -eq knows how to handle this, while == is rightly doing a string comparison:



        $ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
        falsy
        $ if [[ " -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
        truthy


        In short, the string matching condition is not returning true because the strings in fact do not match.






        share|improve this answer


























          8












          8








          8






          Even though [[ ... ]] is "smarter" than [ ... ] or test ..., it's still a better idea to explicitly use numerical comparison operators:



          if [[ "$tpgid" -eq -1 ]]; then ...


          Further, your hexdump:



          $ hd /tmp/test/fff
          00000000 20 20 20 2d 31 | -1|


          shows that $tpgid expands to " -1", not "-1"; -eq knows how to handle this, while == is rightly doing a string comparison:



          $ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
          falsy
          $ if [[ " -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
          truthy


          In short, the string matching condition is not returning true because the strings in fact do not match.






          share|improve this answer














          Even though [[ ... ]] is "smarter" than [ ... ] or test ..., it's still a better idea to explicitly use numerical comparison operators:



          if [[ "$tpgid" -eq -1 ]]; then ...


          Further, your hexdump:



          $ hd /tmp/test/fff
          00000000 20 20 20 2d 31 | -1|


          shows that $tpgid expands to " -1", not "-1"; -eq knows how to handle this, while == is rightly doing a string comparison:



          $ if [[ "   -1" == -1 ]]; then echo truthy; else echo falsy; fi
          falsy
          $ if [[ " -1" -eq -1 ]]; then echo truthy; else echo falsy; fi
          truthy


          In short, the string matching condition is not returning true because the strings in fact do not match.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Dec 31 '18 at 17:47

























          answered Dec 31 '18 at 17:41









          DopeGhotiDopeGhoti

          43.6k55382




          43.6k55382

























              4














              Most likely is that $tpgid contains leading and/or trailing whitespace. Since the value is numeric, you might want to use an arithmetic expression:



              if (( tpgid == -1 )); then ...





              share|improve this answer


























                4














                Most likely is that $tpgid contains leading and/or trailing whitespace. Since the value is numeric, you might want to use an arithmetic expression:



                if (( tpgid == -1 )); then ...





                share|improve this answer
























                  4












                  4








                  4






                  Most likely is that $tpgid contains leading and/or trailing whitespace. Since the value is numeric, you might want to use an arithmetic expression:



                  if (( tpgid == -1 )); then ...





                  share|improve this answer












                  Most likely is that $tpgid contains leading and/or trailing whitespace. Since the value is numeric, you might want to use an arithmetic expression:



                  if (( tpgid == -1 )); then ...






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 31 '18 at 17:36









                  glenn jackmanglenn jackman

                  50.4k570107




                  50.4k570107






























                      draft saved

                      draft discarded




















































                      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.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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%2f491793%2fwhy-is-this-string-matching-condition-in-not-true%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







                      Popular posts from this blog

                      Human spaceflight

                      Can not write log (Is /dev/pts mounted?) - openpty in Ubuntu-on-Windows?

                      張江高科駅