Bash throws error, line 8: $1: unbound variable

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











up vote
0
down vote

favorite












I feel really stupid, but I am trying to learn how to use getopts so that I can have scripts with parsed input (although I think getopts could be better). I am trying to just write a simple script to return partition usage percentages. The problem is that one of my bash functions does not seem to like that I reference $1 as an variable within the function. The reason I reference $1 is because the get_percent function can be passed a mount point as an optional argument to display instead of all of the mount points.



The script



#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent()
if [ -n "$1" ]
then
df -h $1

usage()
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2


# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...


The Output



$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable









share|improve this question























  • I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
    – ilkkachu
    Aug 16 at 18:31










  • @ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
    – Timothy Pulliam
    Aug 16 at 18:33










  • There should be that small "edit" text under the post, just beneath the tags in a question
    – ilkkachu
    Aug 16 at 18:36














up vote
0
down vote

favorite












I feel really stupid, but I am trying to learn how to use getopts so that I can have scripts with parsed input (although I think getopts could be better). I am trying to just write a simple script to return partition usage percentages. The problem is that one of my bash functions does not seem to like that I reference $1 as an variable within the function. The reason I reference $1 is because the get_percent function can be passed a mount point as an optional argument to display instead of all of the mount points.



The script



#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent()
if [ -n "$1" ]
then
df -h $1

usage()
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2


# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...


The Output



$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable









share|improve this question























  • I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
    – ilkkachu
    Aug 16 at 18:31










  • @ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
    – Timothy Pulliam
    Aug 16 at 18:33










  • There should be that small "edit" text under the post, just beneath the tags in a question
    – ilkkachu
    Aug 16 at 18:36












up vote
0
down vote

favorite









up vote
0
down vote

favorite











I feel really stupid, but I am trying to learn how to use getopts so that I can have scripts with parsed input (although I think getopts could be better). I am trying to just write a simple script to return partition usage percentages. The problem is that one of my bash functions does not seem to like that I reference $1 as an variable within the function. The reason I reference $1 is because the get_percent function can be passed a mount point as an optional argument to display instead of all of the mount points.



The script



#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent()
if [ -n "$1" ]
then
df -h $1

usage()
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2


# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...


The Output



$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable









share|improve this question















I feel really stupid, but I am trying to learn how to use getopts so that I can have scripts with parsed input (although I think getopts could be better). I am trying to just write a simple script to return partition usage percentages. The problem is that one of my bash functions does not seem to like that I reference $1 as an variable within the function. The reason I reference $1 is because the get_percent function can be passed a mount point as an optional argument to display instead of all of the mount points.



The script



#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent()
if [ -n "$1" ]
then
df -h $1

usage()
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2


# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...


The Output



$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable






bash shell-script scripting






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Aug 30 at 21:51









Rui F Ribeiro

36.7k1271116




36.7k1271116










asked Aug 16 at 18:00









Timothy Pulliam

1,041617




1,041617











  • I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
    – ilkkachu
    Aug 16 at 18:31










  • @ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
    – Timothy Pulliam
    Aug 16 at 18:33










  • There should be that small "edit" text under the post, just beneath the tags in a question
    – ilkkachu
    Aug 16 at 18:36
















  • I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
    – ilkkachu
    Aug 16 at 18:31










  • @ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
    – Timothy Pulliam
    Aug 16 at 18:33










  • There should be that small "edit" text under the post, just beneath the tags in a question
    – ilkkachu
    Aug 16 at 18:36















I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
– ilkkachu
Aug 16 at 18:31




I don't think this has anything to do with getopts, does it? Your script exits due to -u before calling getopts.
– ilkkachu
Aug 16 at 18:31












@ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
– Timothy Pulliam
Aug 16 at 18:33




@ikkachu no I guess it doesn't. But I'm not sure I can change the title now.
– Timothy Pulliam
Aug 16 at 18:33












There should be that small "edit" text under the post, just beneath the tags in a question
– ilkkachu
Aug 16 at 18:36




There should be that small "edit" text under the post, just beneath the tags in a question
– ilkkachu
Aug 16 at 18:36










3 Answers
3






active

oldest

votes

















up vote
4
down vote



accepted










set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, causing $1 to be unset.



Either check for this before invoking your function, or use default expansions ($1-default will expand to default if not already set to something else).






share|improve this answer




















  • I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
    – Timothy Pulliam
    Aug 16 at 18:10










  • In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
    – ilkkachu
    Aug 16 at 18:30

















up vote
0
down vote













This is the effect of set -u.



You could check $# inside the function and avoid referencing $1 if it is not set.






share|improve this answer



























    up vote
    0
    down vote













    Since this is bash you can sidestep the check for $1 being set and just use "$@" (when double-quoted, this parameter disappears completely if it has no values, which avoids it being caught by set -u):



    get_percent() awk 'NR>1 printf "%st%sn", $1, $5 '



    I've also tweaked the rest of the line slightly so that you don't get spacetabspace between the two values you output but insead you get just a tab. If you really want the two invisible spaces then change the awk to use printf "%s t %sn", $1, $5.






    share|improve this answer




















    • I will have to look into this. I'm not familiar with that variable type. Thanks
      – Timothy Pulliam
      Aug 16 at 18:29











    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%2f463034%2fbash-throws-error-line-8-1-unbound-variable%23new-answer', 'question_page');

    );

    Post as a guest






























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    4
    down vote



    accepted










    set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, causing $1 to be unset.



    Either check for this before invoking your function, or use default expansions ($1-default will expand to default if not already set to something else).






    share|improve this answer




















    • I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
      – Timothy Pulliam
      Aug 16 at 18:10










    • In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
      – ilkkachu
      Aug 16 at 18:30














    up vote
    4
    down vote



    accepted










    set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, causing $1 to be unset.



    Either check for this before invoking your function, or use default expansions ($1-default will expand to default if not already set to something else).






    share|improve this answer




















    • I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
      – Timothy Pulliam
      Aug 16 at 18:10










    • In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
      – ilkkachu
      Aug 16 at 18:30












    up vote
    4
    down vote



    accepted







    up vote
    4
    down vote



    accepted






    set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, causing $1 to be unset.



    Either check for this before invoking your function, or use default expansions ($1-default will expand to default if not already set to something else).






    share|improve this answer












    set -u will abort exactly as you describe if you reference a variable which has not been set. You are invoking your script with no arguments, so get_percent is being invoked with no arguments, causing $1 to be unset.



    Either check for this before invoking your function, or use default expansions ($1-default will expand to default if not already set to something else).







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Aug 16 at 18:04









    DopeGhoti

    41k55080




    41k55080











    • I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
      – Timothy Pulliam
      Aug 16 at 18:10










    • In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
      – ilkkachu
      Aug 16 at 18:30
















    • I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
      – Timothy Pulliam
      Aug 16 at 18:10










    • In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
      – ilkkachu
      Aug 16 at 18:30















    I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
    – Timothy Pulliam
    Aug 16 at 18:10




    I suspected this, but I couldn't think of a way around it. Default expansion seems to have fixed it. Thank you very much!
    – Timothy Pulliam
    Aug 16 at 18:10












    In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
    – ilkkachu
    Aug 16 at 18:30




    In particular, one could use [ -n "$1-" ] (that is, with an empty default value) to see if the parameter is set and non-empty; or [ "$1+x" = x ] to see if it's set, even if empty.
    – ilkkachu
    Aug 16 at 18:30












    up vote
    0
    down vote













    This is the effect of set -u.



    You could check $# inside the function and avoid referencing $1 if it is not set.






    share|improve this answer
























      up vote
      0
      down vote













      This is the effect of set -u.



      You could check $# inside the function and avoid referencing $1 if it is not set.






      share|improve this answer






















        up vote
        0
        down vote










        up vote
        0
        down vote









        This is the effect of set -u.



        You could check $# inside the function and avoid referencing $1 if it is not set.






        share|improve this answer












        This is the effect of set -u.



        You could check $# inside the function and avoid referencing $1 if it is not set.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Aug 16 at 18:04









        RalfFriedl

        3,7001523




        3,7001523




















            up vote
            0
            down vote













            Since this is bash you can sidestep the check for $1 being set and just use "$@" (when double-quoted, this parameter disappears completely if it has no values, which avoids it being caught by set -u):



            get_percent() awk 'NR>1 printf "%st%sn", $1, $5 '



            I've also tweaked the rest of the line slightly so that you don't get spacetabspace between the two values you output but insead you get just a tab. If you really want the two invisible spaces then change the awk to use printf "%s t %sn", $1, $5.






            share|improve this answer




















            • I will have to look into this. I'm not familiar with that variable type. Thanks
              – Timothy Pulliam
              Aug 16 at 18:29















            up vote
            0
            down vote













            Since this is bash you can sidestep the check for $1 being set and just use "$@" (when double-quoted, this parameter disappears completely if it has no values, which avoids it being caught by set -u):



            get_percent() awk 'NR>1 printf "%st%sn", $1, $5 '



            I've also tweaked the rest of the line slightly so that you don't get spacetabspace between the two values you output but insead you get just a tab. If you really want the two invisible spaces then change the awk to use printf "%s t %sn", $1, $5.






            share|improve this answer




















            • I will have to look into this. I'm not familiar with that variable type. Thanks
              – Timothy Pulliam
              Aug 16 at 18:29













            up vote
            0
            down vote










            up vote
            0
            down vote









            Since this is bash you can sidestep the check for $1 being set and just use "$@" (when double-quoted, this parameter disappears completely if it has no values, which avoids it being caught by set -u):



            get_percent() awk 'NR>1 printf "%st%sn", $1, $5 '



            I've also tweaked the rest of the line slightly so that you don't get spacetabspace between the two values you output but insead you get just a tab. If you really want the two invisible spaces then change the awk to use printf "%s t %sn", $1, $5.






            share|improve this answer












            Since this is bash you can sidestep the check for $1 being set and just use "$@" (when double-quoted, this parameter disappears completely if it has no values, which avoids it being caught by set -u):



            get_percent() awk 'NR>1 printf "%st%sn", $1, $5 '



            I've also tweaked the rest of the line slightly so that you don't get spacetabspace between the two values you output but insead you get just a tab. If you really want the two invisible spaces then change the awk to use printf "%s t %sn", $1, $5.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Aug 16 at 18:14









            roaima

            40.4k547110




            40.4k547110











            • I will have to look into this. I'm not familiar with that variable type. Thanks
              – Timothy Pulliam
              Aug 16 at 18:29

















            • I will have to look into this. I'm not familiar with that variable type. Thanks
              – Timothy Pulliam
              Aug 16 at 18:29
















            I will have to look into this. I'm not familiar with that variable type. Thanks
            – Timothy Pulliam
            Aug 16 at 18:29





            I will have to look into this. I'm not familiar with that variable type. Thanks
            – Timothy Pulliam
            Aug 16 at 18:29


















             

            draft saved


            draft discarded















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f463034%2fbash-throws-error-line-8-1-unbound-variable%23new-answer', 'question_page');

            );

            Post as a guest













































































            Popular posts from this blog

            Peggy Mitchell

            Palaiologos

            The Forum (Inglewood, California)