BASH: Code snippet with double square bracket i[[3456]]86

Multi tool use
Multi tool use

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
4
down vote

favorite












I am trying to understand the following code snippet.



host_cpu='i386'

case "$host_cpu" in
i[[3456]]86)
echo "host_cpu=i386"
;;
x86_64)
echo "host_cpu=x86_64"
;;
*)
echo "AC_MSG_ERROR([unsupported CPU type]) "
;;
esac


I added the variable host_cpu='i386' myself to test the code and it switched to the third case of echo "AC_MSG_ERROR([unsupported CPU type]) ".



If I change the double bracket in i[[3456]]86) to a single bracket as in i[3456]86), it switches to the first option yielding i386. This seems correct to me.



I understand that [ and [[ are the test options. The test condition doesn't seem to apply here as the switch cases are expecting a character to be outputted. So I'm assuming for bash to pick it up as a test condition, it needs to be separated by a space as in [ a < b ] or [[ a << b ]]. Because there are no spaces in these case statement, it'll be treated as a regular expression. Is this correct?



So my question is why was the double square bracket was used here by the code writer? It didn't work when I tried to run the code, so what was their intention.



Note: The code was taken from a configure.ac in the GRUB source code.



Also the $host_cpu and host_cpu=i386 line seem unnecessary, can you explain why the writer would have done this:



case "$host_cpu" in
i[[3456]]86)
host_cpu=i386
;;

....... omitted code .....

AC_SUBST(host_cpu)


I'm thinking of using AC_SUBST($host_cpu). Why wouldn't you do it this way?










share|improve this question



















  • 2




    Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
    – Wildcard
    Oct 4 at 1:56














up vote
4
down vote

favorite












I am trying to understand the following code snippet.



host_cpu='i386'

case "$host_cpu" in
i[[3456]]86)
echo "host_cpu=i386"
;;
x86_64)
echo "host_cpu=x86_64"
;;
*)
echo "AC_MSG_ERROR([unsupported CPU type]) "
;;
esac


I added the variable host_cpu='i386' myself to test the code and it switched to the third case of echo "AC_MSG_ERROR([unsupported CPU type]) ".



If I change the double bracket in i[[3456]]86) to a single bracket as in i[3456]86), it switches to the first option yielding i386. This seems correct to me.



I understand that [ and [[ are the test options. The test condition doesn't seem to apply here as the switch cases are expecting a character to be outputted. So I'm assuming for bash to pick it up as a test condition, it needs to be separated by a space as in [ a < b ] or [[ a << b ]]. Because there are no spaces in these case statement, it'll be treated as a regular expression. Is this correct?



So my question is why was the double square bracket was used here by the code writer? It didn't work when I tried to run the code, so what was their intention.



Note: The code was taken from a configure.ac in the GRUB source code.



Also the $host_cpu and host_cpu=i386 line seem unnecessary, can you explain why the writer would have done this:



case "$host_cpu" in
i[[3456]]86)
host_cpu=i386
;;

....... omitted code .....

AC_SUBST(host_cpu)


I'm thinking of using AC_SUBST($host_cpu). Why wouldn't you do it this way?










share|improve this question



















  • 2




    Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
    – Wildcard
    Oct 4 at 1:56












up vote
4
down vote

favorite









up vote
4
down vote

favorite











I am trying to understand the following code snippet.



host_cpu='i386'

case "$host_cpu" in
i[[3456]]86)
echo "host_cpu=i386"
;;
x86_64)
echo "host_cpu=x86_64"
;;
*)
echo "AC_MSG_ERROR([unsupported CPU type]) "
;;
esac


I added the variable host_cpu='i386' myself to test the code and it switched to the third case of echo "AC_MSG_ERROR([unsupported CPU type]) ".



If I change the double bracket in i[[3456]]86) to a single bracket as in i[3456]86), it switches to the first option yielding i386. This seems correct to me.



I understand that [ and [[ are the test options. The test condition doesn't seem to apply here as the switch cases are expecting a character to be outputted. So I'm assuming for bash to pick it up as a test condition, it needs to be separated by a space as in [ a < b ] or [[ a << b ]]. Because there are no spaces in these case statement, it'll be treated as a regular expression. Is this correct?



So my question is why was the double square bracket was used here by the code writer? It didn't work when I tried to run the code, so what was their intention.



Note: The code was taken from a configure.ac in the GRUB source code.



Also the $host_cpu and host_cpu=i386 line seem unnecessary, can you explain why the writer would have done this:



case "$host_cpu" in
i[[3456]]86)
host_cpu=i386
;;

....... omitted code .....

AC_SUBST(host_cpu)


I'm thinking of using AC_SUBST($host_cpu). Why wouldn't you do it this way?










share|improve this question















I am trying to understand the following code snippet.



host_cpu='i386'

case "$host_cpu" in
i[[3456]]86)
echo "host_cpu=i386"
;;
x86_64)
echo "host_cpu=x86_64"
;;
*)
echo "AC_MSG_ERROR([unsupported CPU type]) "
;;
esac


I added the variable host_cpu='i386' myself to test the code and it switched to the third case of echo "AC_MSG_ERROR([unsupported CPU type]) ".



If I change the double bracket in i[[3456]]86) to a single bracket as in i[3456]86), it switches to the first option yielding i386. This seems correct to me.



I understand that [ and [[ are the test options. The test condition doesn't seem to apply here as the switch cases are expecting a character to be outputted. So I'm assuming for bash to pick it up as a test condition, it needs to be separated by a space as in [ a < b ] or [[ a << b ]]. Because there are no spaces in these case statement, it'll be treated as a regular expression. Is this correct?



So my question is why was the double square bracket was used here by the code writer? It didn't work when I tried to run the code, so what was their intention.



Note: The code was taken from a configure.ac in the GRUB source code.



Also the $host_cpu and host_cpu=i386 line seem unnecessary, can you explain why the writer would have done this:



case "$host_cpu" in
i[[3456]]86)
host_cpu=i386
;;

....... omitted code .....

AC_SUBST(host_cpu)


I'm thinking of using AC_SUBST($host_cpu). Why wouldn't you do it this way?







bash






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Oct 4 at 4:12

























asked Oct 4 at 1:30









supmethods

4924




4924







  • 2




    Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
    – Wildcard
    Oct 4 at 1:56












  • 2




    Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
    – Wildcard
    Oct 4 at 1:56







2




2




Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
– Wildcard
Oct 4 at 1:56




Looks like a bug. I suggest you submit a pull request. And no, it's not a regular expression; it's pattern matching, which works the same as file globs.
– Wildcard
Oct 4 at 1:56










1 Answer
1






active

oldest

votes

















up vote
4
down vote













If that's a from a configure.ac file, then it's not a pure shell script, but is an Autoconf script using M4, where are quote characters.:




To fully understand where proper quotation is important, you first
need to know what the special characters are in Autoconf: ‘#’
introduces a comment inside which no macro expansion is performed,
‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves,
‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’
inside a macro definition.



Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:



 int tab[10];
⇒int tab10;
[int tab[10];]
⇒int tab[10];



That [[3456]] should be expanded by autoconf to [3456], which would be the correct output for use as a shell script.






share|improve this answer
















  • 1




    Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
    – steeldriver
    Oct 4 at 2:27











  • Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
    – supmethods
    Oct 4 at 3:56










  • The link you provided use [ and ] as quotes. Does this depend on M4 version used?
    – supmethods
    Oct 4 at 4:01










  • @supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
    – muru
    Oct 4 at 4:17











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',
convertImagesToLinks: false,
noModals: false,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
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%2f473123%2fbash-code-snippet-with-double-square-bracket-i345686%23new-answer', 'question_page');

);

Post as a guest






























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
4
down vote













If that's a from a configure.ac file, then it's not a pure shell script, but is an Autoconf script using M4, where are quote characters.:




To fully understand where proper quotation is important, you first
need to know what the special characters are in Autoconf: ‘#’
introduces a comment inside which no macro expansion is performed,
‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves,
‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’
inside a macro definition.



Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:



 int tab[10];
⇒int tab10;
[int tab[10];]
⇒int tab[10];



That [[3456]] should be expanded by autoconf to [3456], which would be the correct output for use as a shell script.






share|improve this answer
















  • 1




    Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
    – steeldriver
    Oct 4 at 2:27











  • Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
    – supmethods
    Oct 4 at 3:56










  • The link you provided use [ and ] as quotes. Does this depend on M4 version used?
    – supmethods
    Oct 4 at 4:01










  • @supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
    – muru
    Oct 4 at 4:17















up vote
4
down vote













If that's a from a configure.ac file, then it's not a pure shell script, but is an Autoconf script using M4, where are quote characters.:




To fully understand where proper quotation is important, you first
need to know what the special characters are in Autoconf: ‘#’
introduces a comment inside which no macro expansion is performed,
‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves,
‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’
inside a macro definition.



Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:



 int tab[10];
⇒int tab10;
[int tab[10];]
⇒int tab[10];



That [[3456]] should be expanded by autoconf to [3456], which would be the correct output for use as a shell script.






share|improve this answer
















  • 1




    Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
    – steeldriver
    Oct 4 at 2:27











  • Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
    – supmethods
    Oct 4 at 3:56










  • The link you provided use [ and ] as quotes. Does this depend on M4 version used?
    – supmethods
    Oct 4 at 4:01










  • @supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
    – muru
    Oct 4 at 4:17













up vote
4
down vote










up vote
4
down vote









If that's a from a configure.ac file, then it's not a pure shell script, but is an Autoconf script using M4, where are quote characters.:




To fully understand where proper quotation is important, you first
need to know what the special characters are in Autoconf: ‘#’
introduces a comment inside which no macro expansion is performed,
‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves,
‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’
inside a macro definition.



Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:



 int tab[10];
⇒int tab10;
[int tab[10];]
⇒int tab[10];



That [[3456]] should be expanded by autoconf to [3456], which would be the correct output for use as a shell script.






share|improve this answer












If that's a from a configure.ac file, then it's not a pure shell script, but is an Autoconf script using M4, where are quote characters.:




To fully understand where proper quotation is important, you first
need to know what the special characters are in Autoconf: ‘#’
introduces a comment inside which no macro expansion is performed,
‘,’ separates arguments, ‘[’ and ‘]’ are the quotes themselves,
‘(’ and ‘)’ (which M4 tries to match by pairs), and finally ‘$’
inside a macro definition.



Each time there can be a macro expansion, there is a quotation
expansion, i.e., one level of quotes is stripped:



 int tab[10];
⇒int tab10;
[int tab[10];]
⇒int tab[10];



That [[3456]] should be expanded by autoconf to [3456], which would be the correct output for use as a shell script.







share|improve this answer












share|improve this answer



share|improve this answer










answered Oct 4 at 2:16









muru

33.9k578147




33.9k578147







  • 1




    Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
    – steeldriver
    Oct 4 at 2:27











  • Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
    – supmethods
    Oct 4 at 3:56










  • The link you provided use [ and ] as quotes. Does this depend on M4 version used?
    – supmethods
    Oct 4 at 4:01










  • @supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
    – muru
    Oct 4 at 4:17













  • 1




    Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
    – steeldriver
    Oct 4 at 2:27











  • Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
    – supmethods
    Oct 4 at 3:56










  • The link you provided use [ and ] as quotes. Does this depend on M4 version used?
    – supmethods
    Oct 4 at 4:01










  • @supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
    – muru
    Oct 4 at 4:17








1




1




Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
– steeldriver
Oct 4 at 2:27





Indeed - as one can verify by adding a minimal AC_INIT([foo]) to the top of the snippet and then executing autoconf snippet
– steeldriver
Oct 4 at 2:27













Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
– supmethods
Oct 4 at 3:56




Okay, thanks. I've read about m4 and they used the quote characters ` and ' in those articles. So the must have changed the quotes in the configure.ac to treat [ and ] as quotes.
– supmethods
Oct 4 at 3:56












The link you provided use [ and ] as quotes. Does this depend on M4 version used?
– supmethods
Oct 4 at 4:01




The link you provided use [ and ] as quotes. Does this depend on M4 version used?
– supmethods
Oct 4 at 4:01












@supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
– muru
Oct 4 at 4:17





@supmethods you can change the quote characters in M4, and it seems [ ] are set as quote characters in autoconf scripts. The default quote characters in M4 are `' , as you have seen.
– muru
Oct 4 at 4:17


















 

draft saved


draft discarded















































 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f473123%2fbash-code-snippet-with-double-square-bracket-i345686%23new-answer', 'question_page');

);

Post as a guest













































































0Juond,UIg3XpOR3rz8LcSm4FNH98JwS,gCsNNWaTQ99AvYQa81z3CFQEloHS 3vtMHdfc
J1Cm emv8z6kZZpzbh9WgO6dVbHfv5 N,pE28R1AfkE5u u,aD4hGp LVAkHnmxyLESmh,5xz4NVR k,iRNBcxOgTw,G6Jw 5Vh

Popular posts from this blog

How to check contact read email or not when send email to Individual?

How many registers does an x86_64 CPU actually have?

Displaying single band from multi-band raster using QGIS