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;
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 9 hours ago
SuuuehgiSuuuehgi
661510
661510
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
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
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
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
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
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
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 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
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
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
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