Print name if parameter passed to function












4















I have written a little function that exits if the value of the function argument is empty, I would like to be able to also print the name of the parameter (not the value!) if it is possible, my following implementation fails to print the name of the parameter.



function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}


when called like so



exitIfEmpty someKey



should print



Exiting because someKey is empty









share|improve this question









New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

    – choroba
    12 hours ago











  • @choroba I want to print the parameter name if possible not its value.

    – Xerxes
    12 hours ago






  • 1





    What do you mean by the name? Function arguments don't have names.

    – choroba
    12 hours ago
















4















I have written a little function that exits if the value of the function argument is empty, I would like to be able to also print the name of the parameter (not the value!) if it is possible, my following implementation fails to print the name of the parameter.



function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}


when called like so



exitIfEmpty someKey



should print



Exiting because someKey is empty









share|improve this question









New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

    – choroba
    12 hours ago











  • @choroba I want to print the parameter name if possible not its value.

    – Xerxes
    12 hours ago






  • 1





    What do you mean by the name? Function arguments don't have names.

    – choroba
    12 hours ago














4












4








4


1






I have written a little function that exits if the value of the function argument is empty, I would like to be able to also print the name of the parameter (not the value!) if it is possible, my following implementation fails to print the name of the parameter.



function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}


when called like so



exitIfEmpty someKey



should print



Exiting because someKey is empty









share|improve this question









New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I have written a little function that exits if the value of the function argument is empty, I would like to be able to also print the name of the parameter (not the value!) if it is possible, my following implementation fails to print the name of the parameter.



function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}


when called like so



exitIfEmpty someKey



should print



Exiting because someKey is empty






bash






share|improve this question









New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 10 hours ago









GAD3R

27.5k1858114




27.5k1858114






New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 12 hours ago









XerxesXerxes

1936




1936




New contributor




Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Xerxes is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.













  • Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

    – choroba
    12 hours ago











  • @choroba I want to print the parameter name if possible not its value.

    – Xerxes
    12 hours ago






  • 1





    What do you mean by the name? Function arguments don't have names.

    – choroba
    12 hours ago



















  • Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

    – choroba
    12 hours ago











  • @choroba I want to print the parameter name if possible not its value.

    – Xerxes
    12 hours ago






  • 1





    What do you mean by the name? Function arguments don't have names.

    – choroba
    12 hours ago

















Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

– choroba
12 hours ago





Wait, when you give it "someKey", $1 won't be empty. If it's empty, there's nothing to print.

– choroba
12 hours ago













@choroba I want to print the parameter name if possible not its value.

– Xerxes
12 hours ago





@choroba I want to print the parameter name if possible not its value.

– Xerxes
12 hours ago




1




1





What do you mean by the name? Function arguments don't have names.

– choroba
12 hours ago





What do you mean by the name? Function arguments don't have names.

– choroba
12 hours ago










3 Answers
3






active

oldest

votes


















12














What gets passed to the function is just a string. If you run func somevar, what is passed is the string somevar. If you run func $somevar, what is passed is (the word-split) value of the variable somevar. Neither is a variable reference, a pointer or anything like that, they're just strings.



If you want to pass the name of a variable to a function, and then look at the value of that variable, you'll need to use a nameref (Bash 4.3 or later, IIRC), or an indirect reference ${!var}. ${!var} expands to the value of the variable named by `var.



So, you just have it the wrong way in the script, if you pass the name of a variable to function, use "${!1}" to get the value of the variable named in $1, and plain "$1" to get the name.



E.g. this will print variable bar is empty, exiting, and exit the shell:



#!/bin/bash
exitIfEmpty() {
if [ -z "${!1}" ]; then
echo "variable $1 is empty, exiting"
exit 1
fi
}
foo=x
unset bar
exitIfEmpty foo
exitIfEmpty bar





share|improve this answer































    2














    echo "Exiting because $1 is empty"


    should do the trick.






    share|improve this answer



















    • 2





      Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

      – ilkkachu
      12 hours ago











    • ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

      – jimbobmcgee
      8 hours ago



















    1














    Pass the name as second argument



    function exitIfEmpty()
    {
    if [ -z "$1" ]
    then
    echo "Exiting because ${2} is empty"
    exit 1
    fi
    }

    exitIfEmpty $someKey someKey





    share|improve this answer








    New contributor




    JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.





















    • Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

      – αғsнιη
      9 hours ago











    • This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

      – John Kugelman
      5 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
    });


    }
    });






    Xerxes is a new contributor. Be nice, and check out our Code of Conduct.










    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f508764%2fprint-name-if-parameter-passed-to-function%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    12














    What gets passed to the function is just a string. If you run func somevar, what is passed is the string somevar. If you run func $somevar, what is passed is (the word-split) value of the variable somevar. Neither is a variable reference, a pointer or anything like that, they're just strings.



    If you want to pass the name of a variable to a function, and then look at the value of that variable, you'll need to use a nameref (Bash 4.3 or later, IIRC), or an indirect reference ${!var}. ${!var} expands to the value of the variable named by `var.



    So, you just have it the wrong way in the script, if you pass the name of a variable to function, use "${!1}" to get the value of the variable named in $1, and plain "$1" to get the name.



    E.g. this will print variable bar is empty, exiting, and exit the shell:



    #!/bin/bash
    exitIfEmpty() {
    if [ -z "${!1}" ]; then
    echo "variable $1 is empty, exiting"
    exit 1
    fi
    }
    foo=x
    unset bar
    exitIfEmpty foo
    exitIfEmpty bar





    share|improve this answer




























      12














      What gets passed to the function is just a string. If you run func somevar, what is passed is the string somevar. If you run func $somevar, what is passed is (the word-split) value of the variable somevar. Neither is a variable reference, a pointer or anything like that, they're just strings.



      If you want to pass the name of a variable to a function, and then look at the value of that variable, you'll need to use a nameref (Bash 4.3 or later, IIRC), or an indirect reference ${!var}. ${!var} expands to the value of the variable named by `var.



      So, you just have it the wrong way in the script, if you pass the name of a variable to function, use "${!1}" to get the value of the variable named in $1, and plain "$1" to get the name.



      E.g. this will print variable bar is empty, exiting, and exit the shell:



      #!/bin/bash
      exitIfEmpty() {
      if [ -z "${!1}" ]; then
      echo "variable $1 is empty, exiting"
      exit 1
      fi
      }
      foo=x
      unset bar
      exitIfEmpty foo
      exitIfEmpty bar





      share|improve this answer


























        12












        12








        12







        What gets passed to the function is just a string. If you run func somevar, what is passed is the string somevar. If you run func $somevar, what is passed is (the word-split) value of the variable somevar. Neither is a variable reference, a pointer or anything like that, they're just strings.



        If you want to pass the name of a variable to a function, and then look at the value of that variable, you'll need to use a nameref (Bash 4.3 or later, IIRC), or an indirect reference ${!var}. ${!var} expands to the value of the variable named by `var.



        So, you just have it the wrong way in the script, if you pass the name of a variable to function, use "${!1}" to get the value of the variable named in $1, and plain "$1" to get the name.



        E.g. this will print variable bar is empty, exiting, and exit the shell:



        #!/bin/bash
        exitIfEmpty() {
        if [ -z "${!1}" ]; then
        echo "variable $1 is empty, exiting"
        exit 1
        fi
        }
        foo=x
        unset bar
        exitIfEmpty foo
        exitIfEmpty bar





        share|improve this answer













        What gets passed to the function is just a string. If you run func somevar, what is passed is the string somevar. If you run func $somevar, what is passed is (the word-split) value of the variable somevar. Neither is a variable reference, a pointer or anything like that, they're just strings.



        If you want to pass the name of a variable to a function, and then look at the value of that variable, you'll need to use a nameref (Bash 4.3 or later, IIRC), or an indirect reference ${!var}. ${!var} expands to the value of the variable named by `var.



        So, you just have it the wrong way in the script, if you pass the name of a variable to function, use "${!1}" to get the value of the variable named in $1, and plain "$1" to get the name.



        E.g. this will print variable bar is empty, exiting, and exit the shell:



        #!/bin/bash
        exitIfEmpty() {
        if [ -z "${!1}" ]; then
        echo "variable $1 is empty, exiting"
        exit 1
        fi
        }
        foo=x
        unset bar
        exitIfEmpty foo
        exitIfEmpty bar






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 12 hours ago









        ilkkachuilkkachu

        62.7k10103180




        62.7k10103180

























            2














            echo "Exiting because $1 is empty"


            should do the trick.






            share|improve this answer



















            • 2





              Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

              – ilkkachu
              12 hours ago











            • ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

              – jimbobmcgee
              8 hours ago
















            2














            echo "Exiting because $1 is empty"


            should do the trick.






            share|improve this answer



















            • 2





              Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

              – ilkkachu
              12 hours ago











            • ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

              – jimbobmcgee
              8 hours ago














            2












            2








            2







            echo "Exiting because $1 is empty"


            should do the trick.






            share|improve this answer













            echo "Exiting because $1 is empty"


            should do the trick.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 12 hours ago









            PankiPanki

            838412




            838412








            • 2





              Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

              – ilkkachu
              12 hours ago











            • ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

              – jimbobmcgee
              8 hours ago














            • 2





              Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

              – ilkkachu
              12 hours ago











            • ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

              – jimbobmcgee
              8 hours ago








            2




            2





            Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

            – ilkkachu
            12 hours ago





            Wouldn't this always print Exiting because is empty, if the test is against $1 also? That doesn't seem very useful.

            – ilkkachu
            12 hours ago













            ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

            – jimbobmcgee
            8 hours ago





            ITYM echo 'Exit because $1 is empty' or echo "Exit because $1 is empty" -- single-quote strings don't do variable expansion; double-quoted strings require $ to be escaped

            – jimbobmcgee
            8 hours ago











            1














            Pass the name as second argument



            function exitIfEmpty()
            {
            if [ -z "$1" ]
            then
            echo "Exiting because ${2} is empty"
            exit 1
            fi
            }

            exitIfEmpty $someKey someKey





            share|improve this answer








            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.





















            • Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

              – αғsнιη
              9 hours ago











            • This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

              – John Kugelman
              5 hours ago
















            1














            Pass the name as second argument



            function exitIfEmpty()
            {
            if [ -z "$1" ]
            then
            echo "Exiting because ${2} is empty"
            exit 1
            fi
            }

            exitIfEmpty $someKey someKey





            share|improve this answer








            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.





















            • Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

              – αғsнιη
              9 hours ago











            • This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

              – John Kugelman
              5 hours ago














            1












            1








            1







            Pass the name as second argument



            function exitIfEmpty()
            {
            if [ -z "$1" ]
            then
            echo "Exiting because ${2} is empty"
            exit 1
            fi
            }

            exitIfEmpty $someKey someKey





            share|improve this answer








            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.










            Pass the name as second argument



            function exitIfEmpty()
            {
            if [ -z "$1" ]
            then
            echo "Exiting because ${2} is empty"
            exit 1
            fi
            }

            exitIfEmpty $someKey someKey






            share|improve this answer








            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            share|improve this answer



            share|improve this answer






            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            answered 12 hours ago









            JShorthouseJShorthouse

            35316




            35316




            New contributor




            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.





            New contributor





            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.






            JShorthouse is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.













            • Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

              – αғsнιη
              9 hours ago











            • This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

              – John Kugelman
              5 hours ago



















            • Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

              – αғsнιη
              9 hours ago











            • This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

              – John Kugelman
              5 hours ago

















            Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

            – αғsнιη
            9 hours ago





            Here in the question, OP needs to check the value of first argument if it's set else exit; also OP may have not only passing single argument to the function.

            – αғsнιη
            9 hours ago













            This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

            – John Kugelman
            5 hours ago





            This doesn't work. If $someKey is empty then the call will be exitIfEmpty someKey and $2 will be unset. Always quote variables: exitIfEmpty "$someKey" someKey.

            – John Kugelman
            5 hours ago










            Xerxes is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            Xerxes is a new contributor. Be nice, and check out our Code of Conduct.













            Xerxes is a new contributor. Be nice, and check out our Code of Conduct.












            Xerxes is a new contributor. Be nice, and check out our Code of Conduct.
















            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%2f508764%2fprint-name-if-parameter-passed-to-function%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

            How to make a Squid Proxy server?

            Is this a new Fibonacci Identity?

            Touch on Surface Book