bash regexp matching fails in [[ ]]How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell?Number of backslashes needed for escaping regex backslash on the command-linebash readline: Key binding that executes an external commandRegular expression in bash scriptHow to inspect group permissions of a fileBash script to remove userauto creation of bash profiles?Bash: Parse multi-line into single-line commandsStruggling with setting an independent path inside a script to call another scriptsystemd call bash script to create a symlink before daemon processParse config file and pass parameters to another script

Are black holes spherical during merger?

Open office space - complaints for noise - how to respond

Website returning plaintext password

bash regexp matching fails in [[ ]]

Defining the standard model of PA so that a space alien could understand

Is it legal to meet with potential future employers in the UK, whilst visiting from the USA

What Armor Optimization applies to a Mithral full plate?

What is a fully qualified name?

Construct a word ladder

Adding edges to a TreeForm of an expression

what is the correct ownership for files in /Applications

What is the function of the corrugations on a section of the Space Shuttle's external tank?

Can I summon an otherworldly creature with Gate without knowing it's true name?

How to cut a climbing rope?

What happened to boiled-off gases from the storage tanks at Launch Complex 39?

Count Even Digits In Number

Is it possible to remotely hack the GPS system and disable GPS service worldwide?

How to let other coworkers know that I don't share my coworker's political views?

How to melt snow without fire or body heat?

Parallel fifths in the orchestra

Do I need full recovery mode when I have multiple daily backup?

How to zoom and pan very quick in Illustrator?

Python program to find Armstrong numbers in a certain range

Why are Stein manifolds/spaces the analog of affine varieties/schemes in algebraic geometry?



bash regexp matching fails in [[ ]]


How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell?Number of backslashes needed for escaping regex backslash on the command-linebash readline: Key binding that executes an external commandRegular expression in bash scriptHow to inspect group permissions of a fileBash script to remove userauto creation of bash profiles?Bash: Parse multi-line into single-line commandsStruggling with setting an independent path inside a script to call another scriptsystemd call bash script to create a symlink before daemon processParse config file and pass parameters to another script






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








5















I would like to check whether a user is in a certain group via



[[ "$(getent group groupname)" =~ busernameb ]]


but this does not work (bash 5.0.3) although the following works:



getent group groupname | grep -E "busernameb"


I noticed that the backslashes appear to be swallowed at some place



bash -cx '[[ "$(getent group groupname)" =~ busernameb ]]'
++ getent group groupname
+ [[ groupname:x:24:username =~ busernameb ]]


but this could also be an effect of -x.



Can anyone clear this up? :-)










share|improve this question




























    5















    I would like to check whether a user is in a certain group via



    [[ "$(getent group groupname)" =~ busernameb ]]


    but this does not work (bash 5.0.3) although the following works:



    getent group groupname | grep -E "busernameb"


    I noticed that the backslashes appear to be swallowed at some place



    bash -cx '[[ "$(getent group groupname)" =~ busernameb ]]'
    ++ getent group groupname
    + [[ groupname:x:24:username =~ busernameb ]]


    but this could also be an effect of -x.



    Can anyone clear this up? :-)










    share|improve this question
























      5












      5








      5


      1






      I would like to check whether a user is in a certain group via



      [[ "$(getent group groupname)" =~ busernameb ]]


      but this does not work (bash 5.0.3) although the following works:



      getent group groupname | grep -E "busernameb"


      I noticed that the backslashes appear to be swallowed at some place



      bash -cx '[[ "$(getent group groupname)" =~ busernameb ]]'
      ++ getent group groupname
      + [[ groupname:x:24:username =~ busernameb ]]


      but this could also be an effect of -x.



      Can anyone clear this up? :-)










      share|improve this question














      I would like to check whether a user is in a certain group via



      [[ "$(getent group groupname)" =~ busernameb ]]


      but this does not work (bash 5.0.3) although the following works:



      getent group groupname | grep -E "busernameb"


      I noticed that the backslashes appear to be swallowed at some place



      bash -cx '[[ "$(getent group groupname)" =~ busernameb ]]'
      ++ getent group groupname
      + [[ groupname:x:24:username =~ busernameb ]]


      but this could also be an effect of -x.



      Can anyone clear this up? :-)







      bash regular-expression






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 9 hours ago









      SuuuehgiSuuuehgi

      661510




      661510




















          1 Answer
          1






          active

          oldest

          votes


















          9














          In bash, is a quoting operator like ' and ". So:



          [[ "$(getent group groupname)" =~ busernameb ]]


          is the same as:



          [[ "$(getent group groupname)" =~ 'b'username'b' ]]


          Since bash 3.2, bash makes sure than when you quote a character in a regexp, it removes its special meaning as a regexp operator if it had one (which is not the case of b).



          In bash 3.1, you would have been able to do:



          [[ "$(getent group groupname)" =~ 'busernameb' ]]


          And you can still do if you turn on the bash31 option or set $BASH_COMPAT to 3.1. That would also work in zsh.



          That would have worked on systems where the system extended regular expression library supports that b non-standard extension (like on recent GNU systems).



          In bash 3.2 and above, that doesn't work because by quoting the , bash removes the specialness of as a regex operator (in effect it calls the regex library with \busername\b.



          What you can do though is write it:



          regexp='<username>' # here using the slightly more portable < > instead of b
          [[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted


          Then it would work with both bash 3.1 and bash 3.2+ (and zsh and ksh93). See How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell? for more details on that.



          Here though, I'd use standard sh syntax and do:



          group=groupname
          user=username

          group_definition=$(getent -- group "$group") || exit
          case ,$group_definition##*:, in
          (*,"$user",*) printf '%sn' "$user is in the $group groupn"
          esac


          Which also works more reliably if the user name contains regexp operators (. is common in user names) or the user name happens to be the same as the group name.






          share|improve this answer

























          • Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

            – Suuuehgi
            8 hours ago












          • @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

            – Stéphane Chazelas
            7 hours ago












          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%2f520618%2fbash-regexp-matching-fails-in%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          9














          In bash, is a quoting operator like ' and ". So:



          [[ "$(getent group groupname)" =~ busernameb ]]


          is the same as:



          [[ "$(getent group groupname)" =~ 'b'username'b' ]]


          Since bash 3.2, bash makes sure than when you quote a character in a regexp, it removes its special meaning as a regexp operator if it had one (which is not the case of b).



          In bash 3.1, you would have been able to do:



          [[ "$(getent group groupname)" =~ 'busernameb' ]]


          And you can still do if you turn on the bash31 option or set $BASH_COMPAT to 3.1. That would also work in zsh.



          That would have worked on systems where the system extended regular expression library supports that b non-standard extension (like on recent GNU systems).



          In bash 3.2 and above, that doesn't work because by quoting the , bash removes the specialness of as a regex operator (in effect it calls the regex library with \busername\b.



          What you can do though is write it:



          regexp='<username>' # here using the slightly more portable < > instead of b
          [[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted


          Then it would work with both bash 3.1 and bash 3.2+ (and zsh and ksh93). See How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell? for more details on that.



          Here though, I'd use standard sh syntax and do:



          group=groupname
          user=username

          group_definition=$(getent -- group "$group") || exit
          case ,$group_definition##*:, in
          (*,"$user",*) printf '%sn' "$user is in the $group groupn"
          esac


          Which also works more reliably if the user name contains regexp operators (. is common in user names) or the user name happens to be the same as the group name.






          share|improve this answer

























          • Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

            – Suuuehgi
            8 hours ago












          • @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

            – Stéphane Chazelas
            7 hours ago
















          9














          In bash, is a quoting operator like ' and ". So:



          [[ "$(getent group groupname)" =~ busernameb ]]


          is the same as:



          [[ "$(getent group groupname)" =~ 'b'username'b' ]]


          Since bash 3.2, bash makes sure than when you quote a character in a regexp, it removes its special meaning as a regexp operator if it had one (which is not the case of b).



          In bash 3.1, you would have been able to do:



          [[ "$(getent group groupname)" =~ 'busernameb' ]]


          And you can still do if you turn on the bash31 option or set $BASH_COMPAT to 3.1. That would also work in zsh.



          That would have worked on systems where the system extended regular expression library supports that b non-standard extension (like on recent GNU systems).



          In bash 3.2 and above, that doesn't work because by quoting the , bash removes the specialness of as a regex operator (in effect it calls the regex library with \busername\b.



          What you can do though is write it:



          regexp='<username>' # here using the slightly more portable < > instead of b
          [[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted


          Then it would work with both bash 3.1 and bash 3.2+ (and zsh and ksh93). See How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell? for more details on that.



          Here though, I'd use standard sh syntax and do:



          group=groupname
          user=username

          group_definition=$(getent -- group "$group") || exit
          case ,$group_definition##*:, in
          (*,"$user",*) printf '%sn' "$user is in the $group groupn"
          esac


          Which also works more reliably if the user name contains regexp operators (. is common in user names) or the user name happens to be the same as the group name.






          share|improve this answer

























          • Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

            – Suuuehgi
            8 hours ago












          • @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

            – Stéphane Chazelas
            7 hours ago














          9












          9








          9







          In bash, is a quoting operator like ' and ". So:



          [[ "$(getent group groupname)" =~ busernameb ]]


          is the same as:



          [[ "$(getent group groupname)" =~ 'b'username'b' ]]


          Since bash 3.2, bash makes sure than when you quote a character in a regexp, it removes its special meaning as a regexp operator if it had one (which is not the case of b).



          In bash 3.1, you would have been able to do:



          [[ "$(getent group groupname)" =~ 'busernameb' ]]


          And you can still do if you turn on the bash31 option or set $BASH_COMPAT to 3.1. That would also work in zsh.



          That would have worked on systems where the system extended regular expression library supports that b non-standard extension (like on recent GNU systems).



          In bash 3.2 and above, that doesn't work because by quoting the , bash removes the specialness of as a regex operator (in effect it calls the regex library with \busername\b.



          What you can do though is write it:



          regexp='<username>' # here using the slightly more portable < > instead of b
          [[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted


          Then it would work with both bash 3.1 and bash 3.2+ (and zsh and ksh93). See How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell? for more details on that.



          Here though, I'd use standard sh syntax and do:



          group=groupname
          user=username

          group_definition=$(getent -- group "$group") || exit
          case ,$group_definition##*:, in
          (*,"$user",*) printf '%sn' "$user is in the $group groupn"
          esac


          Which also works more reliably if the user name contains regexp operators (. is common in user names) or the user name happens to be the same as the group name.






          share|improve this answer















          In bash, is a quoting operator like ' and ". So:



          [[ "$(getent group groupname)" =~ busernameb ]]


          is the same as:



          [[ "$(getent group groupname)" =~ 'b'username'b' ]]


          Since bash 3.2, bash makes sure than when you quote a character in a regexp, it removes its special meaning as a regexp operator if it had one (which is not the case of b).



          In bash 3.1, you would have been able to do:



          [[ "$(getent group groupname)" =~ 'busernameb' ]]


          And you can still do if you turn on the bash31 option or set $BASH_COMPAT to 3.1. That would also work in zsh.



          That would have worked on systems where the system extended regular expression library supports that b non-standard extension (like on recent GNU systems).



          In bash 3.2 and above, that doesn't work because by quoting the , bash removes the specialness of as a regex operator (in effect it calls the regex library with \busername\b.



          What you can do though is write it:



          regexp='<username>' # here using the slightly more portable < > instead of b
          [[ "$(getent group groupname)" =~ $regexp ]] # make sure $regexp is *not* quoted


          Then it would work with both bash 3.1 and bash 3.2+ (and zsh and ksh93). See How does storing the regular expression in a shell variable avoid problems with quoting characters that are special to the shell? for more details on that.



          Here though, I'd use standard sh syntax and do:



          group=groupname
          user=username

          group_definition=$(getent -- group "$group") || exit
          case ,$group_definition##*:, in
          (*,"$user",*) printf '%sn' "$user is in the $group groupn"
          esac


          Which also works more reliably if the user name contains regexp operators (. is common in user names) or the user name happens to be the same as the group name.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 7 hours ago

























          answered 8 hours ago









          Stéphane ChazelasStéphane Chazelas

          319k57604972




          319k57604972












          • Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

            – Suuuehgi
            8 hours ago












          • @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

            – Stéphane Chazelas
            7 hours ago


















          • Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

            – Suuuehgi
            8 hours ago












          • @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

            – Stéphane Chazelas
            7 hours ago

















          Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

          – Suuuehgi
          8 hours ago






          Thanks a lot! This change in 3.2 seems quite unfortunate regarding the =~ operator considering that you always have to create a regexp-variable first.

          – Suuuehgi
          8 hours ago














          @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

          – Stéphane Chazelas
          7 hours ago






          @Suuuehgi, yes, I kind of agree. See also my latest edit and Why isn't `|` treated literally in a glob pattern? or Which regular expression methods to validate input could be used in shell scripting? or osdn.net/projects/yash/ticket/39094

          – Stéphane Chazelas
          7 hours ago


















          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.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f520618%2fbash-regexp-matching-fails-in%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

          Log på Navigationsmenu

          Creating second map without labels using QGIS?How to lock map labels for inset map in Print Composer?How to Force the Showing of Labels of a Vector File in QGISQGIS Valmiera, Labels only show for part of polygonsRemoving duplicate point labels in QGISLabeling every feature using QGIS?Show labels for point features outside map canvasAbbreviate Road Labels in QGIS only when requiredExporting map from composer in QGIS - text labels have moved in output?How to make sure labels in qgis turn up in layout map?Writing label expression with ArcMap and If then Statement?

          Nuuk Indholdsfortegnelse Etyomologi | Historie | Geografi | Transport og infrastruktur | Politik og administration | Uddannelsesinstitutioner | Kultur | Venskabsbyer | Noter | Eksterne henvisninger | Se også | Navigationsmenuwww.sermersooq.gl64°10′N 51°45′V / 64.167°N 51.750°V / 64.167; -51.75064°10′N 51°45′V / 64.167°N 51.750°V / 64.167; -51.750DMI - KlimanormalerSalmonsen, s. 850Grønlands Naturinstitut undersøger rensdyr i Akia og Maniitsoq foråret 2008Grønlands NaturinstitutNy vej til Qinngorput indviet i dagAntallet af biler i Nuuk må begrænsesNy taxacentral mødt med demonstrationKøreplan. Rute 1, 2 og 3SnescootersporNuukNord er for storSkoler i Kommuneqarfik SermersooqAtuarfik Samuel KleinschmidtKangillinguit AtuarfiatNuussuup AtuarfiaNuuk Internationale FriskoleIlinniarfissuaq, Grønlands SeminariumLedelseÅrsberetning for 2008Kunst og arkitekturÅrsberetning for 2008Julie om naturenNuuk KunstmuseumSilamiutGrønlands Nationalmuseum og ArkivStatistisk ÅrbogGrønlands LandsbibliotekStore koncerter på stribeVandhund nummer 1.000.000Kommuneqarfik Sermersooq – MalikForsidenVenskabsbyerLyngby-Taarbæk i GrønlandArctic Business NetworkWinter Cities 2008 i NuukDagligt opdaterede satellitbilleder fra NuukområdetKommuneqarfik Sermersooqs hjemmesideTurist i NuukGrønlands Statistiks databankGrønlands Hjemmestyres valgresultaterrrWorldCat124325457671310-5