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












1














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 | tail -n +2 | awk '{ print $1,"t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"t",$5 }'
fi
}

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
















1














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 | tail -n +2 | awk '{ print $1,"t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"t",$5 }'
fi
}

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














1












1








1







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 | tail -n +2 | awk '{ print $1,"t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"t",$5 }'
fi
}

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 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 | tail -n +2 | awk '{ print $1,"t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"t",$5 }'
fi
}

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 yesterday









Rui F Ribeiro

38.8k1479128




38.8k1479128










asked Aug 16 at 18:00









Timothy Pulliam

1,120821




1,120821












  • 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


















8














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






  • 1




    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



















0














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





























    0














    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() {
    df -h "$@" | awk 'NR>1 { printf "%st%sn", $1, $5 }'
    }


    I've also tweaked the rest of the line slightly so that you don't get {space}{tab}{space} 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',
    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%2f463034%2fbash-throws-error-line-8-1-unbound-variable%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









    8














    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






    • 1




      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
















    8














    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






    • 1




      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














    8












    8








    8






    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

    43.1k55382




    43.1k55382












    • 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






    • 1




      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






    • 1




      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




    1




    1




    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













    0














    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


























      0














      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
























        0












        0








        0






        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

        5,2933925




        5,2933925























            0














            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() {
            df -h "$@" | awk 'NR>1 { printf "%st%sn", $1, $5 }'
            }


            I've also tweaked the rest of the line slightly so that you don't get {space}{tab}{space} 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


















            0














            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() {
            df -h "$@" | awk 'NR>1 { printf "%st%sn", $1, $5 }'
            }


            I've also tweaked the rest of the line slightly so that you don't get {space}{tab}{space} 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
















            0












            0








            0






            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() {
            df -h "$@" | awk 'NR>1 { printf "%st%sn", $1, $5 }'
            }


            I've also tweaked the rest of the line slightly so that you don't get {space}{tab}{space} 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() {
            df -h "$@" | awk 'NR>1 { printf "%st%sn", $1, $5 }'
            }


            I've also tweaked the rest of the line slightly so that you don't get {space}{tab}{space} 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

            42.7k551116




            42.7k551116












            • 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




















































            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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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%2f463034%2fbash-throws-error-line-8-1-unbound-variable%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

            サソリ

            広島県道265号伴広島線

            Accessing regular linux commands in Huawei's Dopra Linux