Why does ${$#} return same result as $$ in dash?












1















While trying to get last positional parameter set in /bin/dash , I've tried echo ${$#}. Surprisingly this did not result in an error, but into PID which is the same as $$ variable contents. Question, is why did that syntax work ? What is the syntax rule that shell applied here ?



Basically, what I did is



$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819


Apparently, % character also get ignored in such construct



$ echo ${$%}
13819


But * and @ result in bad substitution error:



$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution









share|improve this question























  • What are you expecting ${$*} and ${$@} to produce?

    – Kusalananda
    1 min ago
















1















While trying to get last positional parameter set in /bin/dash , I've tried echo ${$#}. Surprisingly this did not result in an error, but into PID which is the same as $$ variable contents. Question, is why did that syntax work ? What is the syntax rule that shell applied here ?



Basically, what I did is



$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819


Apparently, % character also get ignored in such construct



$ echo ${$%}
13819


But * and @ result in bad substitution error:



$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution









share|improve this question























  • What are you expecting ${$*} and ${$@} to produce?

    – Kusalananda
    1 min ago














1












1








1


1






While trying to get last positional parameter set in /bin/dash , I've tried echo ${$#}. Surprisingly this did not result in an error, but into PID which is the same as $$ variable contents. Question, is why did that syntax work ? What is the syntax rule that shell applied here ?



Basically, what I did is



$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819


Apparently, % character also get ignored in such construct



$ echo ${$%}
13819


But * and @ result in bad substitution error:



$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution









share|improve this question














While trying to get last positional parameter set in /bin/dash , I've tried echo ${$#}. Surprisingly this did not result in an error, but into PID which is the same as $$ variable contents. Question, is why did that syntax work ? What is the syntax rule that shell applied here ?



Basically, what I did is



$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819


Apparently, % character also get ignored in such construct



$ echo ${$%}
13819


But * and @ result in bad substitution error:



$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution






shell






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 14 mins ago









Sergiy KolodyazhnyySergiy Kolodyazhnyy

10.2k32660




10.2k32660













  • What are you expecting ${$*} and ${$@} to produce?

    – Kusalananda
    1 min ago



















  • What are you expecting ${$*} and ${$@} to produce?

    – Kusalananda
    1 min ago

















What are you expecting ${$*} and ${$@} to produce?

– Kusalananda
1 min ago





What are you expecting ${$*} and ${$@} to produce?

– Kusalananda
1 min ago










1 Answer
1






active

oldest

votes


















2














This is $$ with an empty prefix removed:




${parameter#[word]}



Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted #.




The same applies for % (suffix). @ and * are not parameter expansion modifiers, so they are errors. It would happen for $? or a hypothetical $= as well.





share























    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%2f500330%2fwhy-does-return-same-result-as-in-dash%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









    2














    This is $$ with an empty prefix removed:




    ${parameter#[word]}



    Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted #.




    The same applies for % (suffix). @ and * are not parameter expansion modifiers, so they are errors. It would happen for $? or a hypothetical $= as well.





    share




























      2














      This is $$ with an empty prefix removed:




      ${parameter#[word]}



      Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted #.




      The same applies for % (suffix). @ and * are not parameter expansion modifiers, so they are errors. It would happen for $? or a hypothetical $= as well.





      share


























        2












        2








        2







        This is $$ with an empty prefix removed:




        ${parameter#[word]}



        Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted #.




        The same applies for % (suffix). @ and * are not parameter expansion modifiers, so they are errors. It would happen for $? or a hypothetical $= as well.





        share













        This is $$ with an empty prefix removed:




        ${parameter#[word]}



        Remove Smallest Prefix Pattern. The word shall be expanded to produce a pattern. The parameter expansion shall then result in parameter, with the smallest portion of the prefix matched by the pattern deleted. If present, word shall not begin with an unquoted #.




        The same applies for % (suffix). @ and * are not parameter expansion modifiers, so they are errors. It would happen for $? or a hypothetical $= as well.






        share











        share


        share










        answered 4 mins ago









        Michael HomerMichael Homer

        48.3k8127167




        48.3k8127167






























            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%2f500330%2fwhy-does-return-same-result-as-in-dash%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

            Loup dans la culture

            How to solve the problem of ntp “Unable to contact time server” from KDE?

            ASUS Zenbook UX433/UX333 — Configure Touchpad-embedded numpad on Linux