bash cannot correctly parse and shift path variable without slash in the end












0















my problem, I am using a script foo.sh



while [ -n "$1" ]
do
case $1 in
-p)
P=$2
shift 2
;;
-s)
S=$2
shift 2
;;

esac
done


to parse 2 expected variables: s and p, where p will be a path of dir and s will be a path to file.



For ./foo.sh -p /aa/bb/cc -s dd/ee.tar.gz
I am expecting P to be /aa/bb/cc and S to be dd/ee.tar.gz.



But I found above will give me a P=/aa/bb/cc, as expected, BUT the S is empty!



If I add a slash to the end of path or quote the path, for example
./foo.sh -p /aa/bb/cc/ -s dd/ee.tar.gz
./foo.sh -p "/aa/bb/cc" -s dd/ee.tar.gz
Then it works as expected again.



I read through the similar questions










share|improve this question







New contributor




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
















  • 3





    I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

    – Kusalananda
    2 hours ago











  • Same. The code works for me as expected with the options you have provided

    – Jesse_b
    2 hours ago






  • 1





    Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

    – ilkkachu
    2 hours ago


















0















my problem, I am using a script foo.sh



while [ -n "$1" ]
do
case $1 in
-p)
P=$2
shift 2
;;
-s)
S=$2
shift 2
;;

esac
done


to parse 2 expected variables: s and p, where p will be a path of dir and s will be a path to file.



For ./foo.sh -p /aa/bb/cc -s dd/ee.tar.gz
I am expecting P to be /aa/bb/cc and S to be dd/ee.tar.gz.



But I found above will give me a P=/aa/bb/cc, as expected, BUT the S is empty!



If I add a slash to the end of path or quote the path, for example
./foo.sh -p /aa/bb/cc/ -s dd/ee.tar.gz
./foo.sh -p "/aa/bb/cc" -s dd/ee.tar.gz
Then it works as expected again.



I read through the similar questions










share|improve this question







New contributor




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
















  • 3





    I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

    – Kusalananda
    2 hours ago











  • Same. The code works for me as expected with the options you have provided

    – Jesse_b
    2 hours ago






  • 1





    Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

    – ilkkachu
    2 hours ago
















0












0








0








my problem, I am using a script foo.sh



while [ -n "$1" ]
do
case $1 in
-p)
P=$2
shift 2
;;
-s)
S=$2
shift 2
;;

esac
done


to parse 2 expected variables: s and p, where p will be a path of dir and s will be a path to file.



For ./foo.sh -p /aa/bb/cc -s dd/ee.tar.gz
I am expecting P to be /aa/bb/cc and S to be dd/ee.tar.gz.



But I found above will give me a P=/aa/bb/cc, as expected, BUT the S is empty!



If I add a slash to the end of path or quote the path, for example
./foo.sh -p /aa/bb/cc/ -s dd/ee.tar.gz
./foo.sh -p "/aa/bb/cc" -s dd/ee.tar.gz
Then it works as expected again.



I read through the similar questions










share|improve this question







New contributor




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












my problem, I am using a script foo.sh



while [ -n "$1" ]
do
case $1 in
-p)
P=$2
shift 2
;;
-s)
S=$2
shift 2
;;

esac
done


to parse 2 expected variables: s and p, where p will be a path of dir and s will be a path to file.



For ./foo.sh -p /aa/bb/cc -s dd/ee.tar.gz
I am expecting P to be /aa/bb/cc and S to be dd/ee.tar.gz.



But I found above will give me a P=/aa/bb/cc, as expected, BUT the S is empty!



If I add a slash to the end of path or quote the path, for example
./foo.sh -p /aa/bb/cc/ -s dd/ee.tar.gz
./foo.sh -p "/aa/bb/cc" -s dd/ee.tar.gz
Then it works as expected again.



I read through the similar questions







bash






share|improve this question







New contributor




Psyduck 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




Psyduck 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






New contributor




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









asked 2 hours ago









PsyduckPsyduck

11




11




New contributor




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





New contributor





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






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








  • 3





    I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

    – Kusalananda
    2 hours ago











  • Same. The code works for me as expected with the options you have provided

    – Jesse_b
    2 hours ago






  • 1





    Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

    – ilkkachu
    2 hours ago
















  • 3





    I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

    – Kusalananda
    2 hours ago











  • Same. The code works for me as expected with the options you have provided

    – Jesse_b
    2 hours ago






  • 1





    Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

    – ilkkachu
    2 hours ago










3




3





I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

– Kusalananda
2 hours ago





I can not reproduce your issue. The code behaves as expected. One may have wanted to implement it with a while loop over getopts, but your code works for the examples you show (including the first ones). Please mention what happens before and after this code snippet and where you test the value of the variables.

– Kusalananda
2 hours ago













Same. The code works for me as expected with the options you have provided

– Jesse_b
2 hours ago





Same. The code works for me as expected with the options you have provided

– Jesse_b
2 hours ago




1




1





Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

– ilkkachu
2 hours ago







Especially the quoting shouldn't possibly matter at all: -p /aa/bb/cc is exactly the same thing as -p "/aa/bb/cc". Of course, if you're actually using something else than a static string there, things might be different.

– ilkkachu
2 hours ago












1 Answer
1






active

oldest

votes


















0














In order to implement your code using getopts



while getopts p:s: opt; do
case $opt in
p) p=$OPTARG;;
s) s=$OPTARG;;
esac
done


The : after the option indicates it requires an argument which will be set to the OPTARG variable.






share|improve this answer























    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
    });


    }
    });






    Psyduck 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%2f506365%2fbash-cannot-correctly-parse-and-shift-path-variable-without-slash-in-the-end%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









    0














    In order to implement your code using getopts



    while getopts p:s: opt; do
    case $opt in
    p) p=$OPTARG;;
    s) s=$OPTARG;;
    esac
    done


    The : after the option indicates it requires an argument which will be set to the OPTARG variable.






    share|improve this answer




























      0














      In order to implement your code using getopts



      while getopts p:s: opt; do
      case $opt in
      p) p=$OPTARG;;
      s) s=$OPTARG;;
      esac
      done


      The : after the option indicates it requires an argument which will be set to the OPTARG variable.






      share|improve this answer


























        0












        0








        0







        In order to implement your code using getopts



        while getopts p:s: opt; do
        case $opt in
        p) p=$OPTARG;;
        s) s=$OPTARG;;
        esac
        done


        The : after the option indicates it requires an argument which will be set to the OPTARG variable.






        share|improve this answer













        In order to implement your code using getopts



        while getopts p:s: opt; do
        case $opt in
        p) p=$OPTARG;;
        s) s=$OPTARG;;
        esac
        done


        The : after the option indicates it requires an argument which will be set to the OPTARG variable.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 2 hours ago









        Jesse_bJesse_b

        13.4k23370




        13.4k23370






















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










            draft saved

            draft discarded


















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













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












            Psyduck 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%2f506365%2fbash-cannot-correctly-parse-and-shift-path-variable-without-slash-in-the-end%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

            Entries order in /etc/network/interfaces

            新発田市

            Grub takes very long (several minutes) to open Menu (in Multi-Boot-System)