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
LuaLaTex - how to use number, computed later in the document
Is it a bad idea to to run 24 tap and shock lands in standard
You have (3^2 + 2^3 + 2^2) Guesses Left. Figure out the Last one
Should I ask for an extra raise?
Meaning of 'lose their grip on the groins of their followers'
Teaching a class likely meant to inflate the GPA of student athletes
What is the maximum number of net attacks that one can make in a round?
Which languages would be most useful in Europe at the end of the 19th century?
How to decline a wedding invitation from a friend I haven't seen in years?
Why we don’t make use of the t-distribution for constructing a confidence interval for a proportion?
Fixing obscure 8080 emulator bug?
Are there any important biographies of nobodies?
I have a problematic assistant manager, but I can't fire him
Has there been a multiethnic Star Trek character?
Why didn't Voldemort recognize that Dumbledore was affected by his curse?
How to hide rifle during medieval town entrance inspection?
Is it possible for a vehicle to be manufactured without a catalytic converter?
Why is a common reference string needed in zero knowledge proofs?
Why was this person allowed to become Grand Maester?
How do you say "homebrewer" in Spanish?
Active low-pass filters --- good to what frequencies?
What is inside of the 200 star chest?
If I leave the US through an airport, do I have to return through the same airport?
How to safely destroy (a large quantity of) valid checks?
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;
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
add a comment |
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
add a comment |
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
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
bash regular-expression
asked May 23 at 11:19
SuuuehgiSuuuehgi
671511
671511
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
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
May 23 at 12:12
@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
May 23 at 13:03
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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
May 23 at 12:12
@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
May 23 at 13:03
add a comment |
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.
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
May 23 at 12:12
@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
May 23 at 13:03
add a comment |
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.
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.
edited May 23 at 12:55
answered May 23 at 11:35
Stéphane ChazelasStéphane Chazelas
321k57612982
321k57612982
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
May 23 at 12:12
@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
May 23 at 13:03
add a comment |
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
May 23 at 12:12
@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
May 23 at 13:03
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
May 23 at 12:12
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
May 23 at 12:12
@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
May 23 at 13:03
@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
May 23 at 13:03
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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