Passing args from the bash script to the function in the script Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara 2019 Community Moderator Election Results Why I closed the “Why is Kali so hard” questionAre there naming conventions for variables in shell scripts?When is double-quoting necessary?How can we run a command stored in a variable?Passing a stream to a bash functionPassing script string to ssh from within a bash script function - variable evaluation problembash script - loop functionShell script - command always display usage before executingrsync using function argsBash script inheritance? Calling a function from another script?Passing options/args/parameters with spaces from the script to a function withinPassing a boolean flag to a function?Dynamically read bash function name from inside bash functionrunning bash script from cron job not working properly

Multi tool use
Multi tool use

As an international instructor, should I openly talk about my accent?

How long after the last departure shall the airport stay open for an emergency return?

Could Neutrino technically as side-effect, incentivize centralization of the bitcoin network?

Why does the Cisco show run command not show the full version, while the show version command does?

Has a Nobel Peace laureate ever been accused of war crimes?

Is this homebrew racial feat, Stonehide, balanced?

Protagonist's race is hidden - should I reveal it?

Error: Syntax error. Missing ')' for CASE Statement

The art of proof summarizing. Are there known rules, or is it a purely common sense matter?

Map material from china not allowed to leave the country

Are these square matrices always diagonalisable?

How do I check if a string is entirely made of the same substring?

Implementing 3DES algorithm in Java: is my code secure?

Additive group of local rings

What is the ongoing value of the Kanban board to the developers as opposed to management

Multiple fireplaces in an apartment building?

Justification for leaving new position after a short time

What's the difference between using dependency injection with a container and using a service locator?

Is Electric Central Heating worth it if using Solar Panels?

Would reducing the reference voltage of an ADC have any effect on accuracy?

Are all CP/M-80 implementations binary compatible?

What is it called when you ride around on your front wheel?

Need of separate security plugins for both root and subfolder sites Wordpress?

Mistake in years of experience in resume?



Passing args from the bash script to the function in the script



Unicorn Meta Zoo #1: Why another podcast?
Announcing the arrival of Valued Associate #679: Cesar Manara
2019 Community Moderator Election Results
Why I closed the “Why is Kali so hard” questionAre there naming conventions for variables in shell scripts?When is double-quoting necessary?How can we run a command stored in a variable?Passing a stream to a bash functionPassing script string to ssh from within a bash script function - variable evaluation problembash script - loop functionShell script - command always display usage before executingrsync using function argsBash script inheritance? Calling a function from another script?Passing options/args/parameters with spaces from the script to a function withinPassing a boolean flag to a function?Dynamically read bash function name from inside bash functionrunning bash script from cron job not working properly



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








1















My script:



#! /bin/bash --

set -x

## docker-compose wrapper
compose_fn()
local ENV="$1"
local VERB="$2"
local SERVICE="$3"
local CMD="docker-compose -f $ENV.yml"
case "$VERB" in
(exec)
shift "$#" # remove args passed to this fn
# Execute a command in a running container.
if [ -n "$SERVICE" ]; then
$CMD "$VERB" "$SERVICE" "$@"
else
echo "## Err: You must specify service name..."
exit 1
fi
;;
esac


compose_fn "$1" "$2" "$3"


Is giving me a hard time with the following error:



$ ./tst.sh dev exec django sh
+ compose_fn dev exec django
+ local ENV=dev
+ local VERB=exec
+ local SERVICE=django
+ local 'CMD=docker-compose -f dev.yml'
+ case "$VERB" in
+ shift 3
+ '[' -n django ']'
+ docker-compose -f dev.yml exec django
Execute a command in a running container

Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

Options:
....


Where is my mistake? How can it be done better?



As far as I can tell I've passed 4 args [dev, exec, django, sh] to the script, then within the script removed 3 (shift 3), therefore sh should have been left in the $@ var.










share|improve this question






























    1















    My script:



    #! /bin/bash --

    set -x

    ## docker-compose wrapper
    compose_fn()
    local ENV="$1"
    local VERB="$2"
    local SERVICE="$3"
    local CMD="docker-compose -f $ENV.yml"
    case "$VERB" in
    (exec)
    shift "$#" # remove args passed to this fn
    # Execute a command in a running container.
    if [ -n "$SERVICE" ]; then
    $CMD "$VERB" "$SERVICE" "$@"
    else
    echo "## Err: You must specify service name..."
    exit 1
    fi
    ;;
    esac


    compose_fn "$1" "$2" "$3"


    Is giving me a hard time with the following error:



    $ ./tst.sh dev exec django sh
    + compose_fn dev exec django
    + local ENV=dev
    + local VERB=exec
    + local SERVICE=django
    + local 'CMD=docker-compose -f dev.yml'
    + case "$VERB" in
    + shift 3
    + '[' -n django ']'
    + docker-compose -f dev.yml exec django
    Execute a command in a running container

    Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

    Options:
    ....


    Where is my mistake? How can it be done better?



    As far as I can tell I've passed 4 args [dev, exec, django, sh] to the script, then within the script removed 3 (shift 3), therefore sh should have been left in the $@ var.










    share|improve this question


























      1












      1








      1








      My script:



      #! /bin/bash --

      set -x

      ## docker-compose wrapper
      compose_fn()
      local ENV="$1"
      local VERB="$2"
      local SERVICE="$3"
      local CMD="docker-compose -f $ENV.yml"
      case "$VERB" in
      (exec)
      shift "$#" # remove args passed to this fn
      # Execute a command in a running container.
      if [ -n "$SERVICE" ]; then
      $CMD "$VERB" "$SERVICE" "$@"
      else
      echo "## Err: You must specify service name..."
      exit 1
      fi
      ;;
      esac


      compose_fn "$1" "$2" "$3"


      Is giving me a hard time with the following error:



      $ ./tst.sh dev exec django sh
      + compose_fn dev exec django
      + local ENV=dev
      + local VERB=exec
      + local SERVICE=django
      + local 'CMD=docker-compose -f dev.yml'
      + case "$VERB" in
      + shift 3
      + '[' -n django ']'
      + docker-compose -f dev.yml exec django
      Execute a command in a running container

      Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

      Options:
      ....


      Where is my mistake? How can it be done better?



      As far as I can tell I've passed 4 args [dev, exec, django, sh] to the script, then within the script removed 3 (shift 3), therefore sh should have been left in the $@ var.










      share|improve this question
















      My script:



      #! /bin/bash --

      set -x

      ## docker-compose wrapper
      compose_fn()
      local ENV="$1"
      local VERB="$2"
      local SERVICE="$3"
      local CMD="docker-compose -f $ENV.yml"
      case "$VERB" in
      (exec)
      shift "$#" # remove args passed to this fn
      # Execute a command in a running container.
      if [ -n "$SERVICE" ]; then
      $CMD "$VERB" "$SERVICE" "$@"
      else
      echo "## Err: You must specify service name..."
      exit 1
      fi
      ;;
      esac


      compose_fn "$1" "$2" "$3"


      Is giving me a hard time with the following error:



      $ ./tst.sh dev exec django sh
      + compose_fn dev exec django
      + local ENV=dev
      + local VERB=exec
      + local SERVICE=django
      + local 'CMD=docker-compose -f dev.yml'
      + case "$VERB" in
      + shift 3
      + '[' -n django ']'
      + docker-compose -f dev.yml exec django
      Execute a command in a running container

      Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]

      Options:
      ....


      Where is my mistake? How can it be done better?



      As far as I can tell I've passed 4 args [dev, exec, django, sh] to the script, then within the script removed 3 (shift 3), therefore sh should have been left in the $@ var.







      bash shell-script shell






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 hours ago







      NarūnasK

















      asked 2 hours ago









      NarūnasKNarūnasK

      9171722




      9171722




















          1 Answer
          1






          active

          oldest

          votes


















          4














          With shift $# you empty $@ completely. The $@ in the function is separate from the $@ in the main script. Why don't you just pass all arguments to the function and then shift off the first three?



          #! /bin/bash --

          set -x

          ## docker-compose wrapper
          compose_fn()
          local env="$1"
          local verb="$2"
          local service="$3"

          local cmd=( docker-compose -f "$env.yml" )

          shift 3 # we've now used up three arguments

          case $verb in
          exec)
          # Execute a command in a running container.
          if [ -n "$service" ]; then
          "$cmd[@]" "$verb" "$service" "$@"
          else
          echo '## Err: You must specify service name...' >&2
          exit 1
          fi
          ;;
          *)
          printf 'Unknown verb: %sn' "$verb" >&2
          exit 1
          esac


          compose_fn "$@"


          I've also used lower-case variable names so that no system or special shell variables are used by accident (ENV is one that some shell uses under some circumstances, for example), and I've removed all unneeded quotes and curly braces.



          I've also put the command into an array, so that we can quote the YAML filename properly.



          You could also just move the setting of the three variables outside of the function, depending on what the rest of the script looks like and if this makes any sense at all. The three variables would then be global in the script.



          #! /bin/bash --

          set -x

          ## docker-compose wrapper
          compose_fn()
          local cmd=( docker-compose -f "$env.yml" )

          case $verb in
          exec)
          # Execute a command in a running container.
          if [ -n "$service" ]; then
          "$cmd[@]" "$verb" "$service" "$@"
          else
          echo '## Err: You must specify service name...' >&2
          exit 1
          fi
          ;;
          *)
          printf 'Unknown verb: %sn' "$verb" >&2
          exit 1
          esac


          env="$1"
          verb="$2"
          service="$3"

          shift 3

          compose_fn "$@"


          You may also bypass the [ -n "$service" ] test with



          service=$3:?'## Err: You must specify service name...'


          The parameter expansion $parameter:?word will exit the shell with the message defined by word if parameter is unset or empty. The bash shell would format this as



          script.sh: line 9: 3: ## Err: You must specify service name...


          Related:



          • When is double-quoting necessary?

          • How can we run a command stored in a variable?

          • Are there naming conventions for variables in shell scripts?





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



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f515342%2fpassing-args-from-the-bash-script-to-the-function-in-the-script%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









            4














            With shift $# you empty $@ completely. The $@ in the function is separate from the $@ in the main script. Why don't you just pass all arguments to the function and then shift off the first three?



            #! /bin/bash --

            set -x

            ## docker-compose wrapper
            compose_fn()
            local env="$1"
            local verb="$2"
            local service="$3"

            local cmd=( docker-compose -f "$env.yml" )

            shift 3 # we've now used up three arguments

            case $verb in
            exec)
            # Execute a command in a running container.
            if [ -n "$service" ]; then
            "$cmd[@]" "$verb" "$service" "$@"
            else
            echo '## Err: You must specify service name...' >&2
            exit 1
            fi
            ;;
            *)
            printf 'Unknown verb: %sn' "$verb" >&2
            exit 1
            esac


            compose_fn "$@"


            I've also used lower-case variable names so that no system or special shell variables are used by accident (ENV is one that some shell uses under some circumstances, for example), and I've removed all unneeded quotes and curly braces.



            I've also put the command into an array, so that we can quote the YAML filename properly.



            You could also just move the setting of the three variables outside of the function, depending on what the rest of the script looks like and if this makes any sense at all. The three variables would then be global in the script.



            #! /bin/bash --

            set -x

            ## docker-compose wrapper
            compose_fn()
            local cmd=( docker-compose -f "$env.yml" )

            case $verb in
            exec)
            # Execute a command in a running container.
            if [ -n "$service" ]; then
            "$cmd[@]" "$verb" "$service" "$@"
            else
            echo '## Err: You must specify service name...' >&2
            exit 1
            fi
            ;;
            *)
            printf 'Unknown verb: %sn' "$verb" >&2
            exit 1
            esac


            env="$1"
            verb="$2"
            service="$3"

            shift 3

            compose_fn "$@"


            You may also bypass the [ -n "$service" ] test with



            service=$3:?'## Err: You must specify service name...'


            The parameter expansion $parameter:?word will exit the shell with the message defined by word if parameter is unset or empty. The bash shell would format this as



            script.sh: line 9: 3: ## Err: You must specify service name...


            Related:



            • When is double-quoting necessary?

            • How can we run a command stored in a variable?

            • Are there naming conventions for variables in shell scripts?





            share|improve this answer





























              4














              With shift $# you empty $@ completely. The $@ in the function is separate from the $@ in the main script. Why don't you just pass all arguments to the function and then shift off the first three?



              #! /bin/bash --

              set -x

              ## docker-compose wrapper
              compose_fn()
              local env="$1"
              local verb="$2"
              local service="$3"

              local cmd=( docker-compose -f "$env.yml" )

              shift 3 # we've now used up three arguments

              case $verb in
              exec)
              # Execute a command in a running container.
              if [ -n "$service" ]; then
              "$cmd[@]" "$verb" "$service" "$@"
              else
              echo '## Err: You must specify service name...' >&2
              exit 1
              fi
              ;;
              *)
              printf 'Unknown verb: %sn' "$verb" >&2
              exit 1
              esac


              compose_fn "$@"


              I've also used lower-case variable names so that no system or special shell variables are used by accident (ENV is one that some shell uses under some circumstances, for example), and I've removed all unneeded quotes and curly braces.



              I've also put the command into an array, so that we can quote the YAML filename properly.



              You could also just move the setting of the three variables outside of the function, depending on what the rest of the script looks like and if this makes any sense at all. The three variables would then be global in the script.



              #! /bin/bash --

              set -x

              ## docker-compose wrapper
              compose_fn()
              local cmd=( docker-compose -f "$env.yml" )

              case $verb in
              exec)
              # Execute a command in a running container.
              if [ -n "$service" ]; then
              "$cmd[@]" "$verb" "$service" "$@"
              else
              echo '## Err: You must specify service name...' >&2
              exit 1
              fi
              ;;
              *)
              printf 'Unknown verb: %sn' "$verb" >&2
              exit 1
              esac


              env="$1"
              verb="$2"
              service="$3"

              shift 3

              compose_fn "$@"


              You may also bypass the [ -n "$service" ] test with



              service=$3:?'## Err: You must specify service name...'


              The parameter expansion $parameter:?word will exit the shell with the message defined by word if parameter is unset or empty. The bash shell would format this as



              script.sh: line 9: 3: ## Err: You must specify service name...


              Related:



              • When is double-quoting necessary?

              • How can we run a command stored in a variable?

              • Are there naming conventions for variables in shell scripts?





              share|improve this answer



























                4












                4








                4







                With shift $# you empty $@ completely. The $@ in the function is separate from the $@ in the main script. Why don't you just pass all arguments to the function and then shift off the first three?



                #! /bin/bash --

                set -x

                ## docker-compose wrapper
                compose_fn()
                local env="$1"
                local verb="$2"
                local service="$3"

                local cmd=( docker-compose -f "$env.yml" )

                shift 3 # we've now used up three arguments

                case $verb in
                exec)
                # Execute a command in a running container.
                if [ -n "$service" ]; then
                "$cmd[@]" "$verb" "$service" "$@"
                else
                echo '## Err: You must specify service name...' >&2
                exit 1
                fi
                ;;
                *)
                printf 'Unknown verb: %sn' "$verb" >&2
                exit 1
                esac


                compose_fn "$@"


                I've also used lower-case variable names so that no system or special shell variables are used by accident (ENV is one that some shell uses under some circumstances, for example), and I've removed all unneeded quotes and curly braces.



                I've also put the command into an array, so that we can quote the YAML filename properly.



                You could also just move the setting of the three variables outside of the function, depending on what the rest of the script looks like and if this makes any sense at all. The three variables would then be global in the script.



                #! /bin/bash --

                set -x

                ## docker-compose wrapper
                compose_fn()
                local cmd=( docker-compose -f "$env.yml" )

                case $verb in
                exec)
                # Execute a command in a running container.
                if [ -n "$service" ]; then
                "$cmd[@]" "$verb" "$service" "$@"
                else
                echo '## Err: You must specify service name...' >&2
                exit 1
                fi
                ;;
                *)
                printf 'Unknown verb: %sn' "$verb" >&2
                exit 1
                esac


                env="$1"
                verb="$2"
                service="$3"

                shift 3

                compose_fn "$@"


                You may also bypass the [ -n "$service" ] test with



                service=$3:?'## Err: You must specify service name...'


                The parameter expansion $parameter:?word will exit the shell with the message defined by word if parameter is unset or empty. The bash shell would format this as



                script.sh: line 9: 3: ## Err: You must specify service name...


                Related:



                • When is double-quoting necessary?

                • How can we run a command stored in a variable?

                • Are there naming conventions for variables in shell scripts?





                share|improve this answer















                With shift $# you empty $@ completely. The $@ in the function is separate from the $@ in the main script. Why don't you just pass all arguments to the function and then shift off the first three?



                #! /bin/bash --

                set -x

                ## docker-compose wrapper
                compose_fn()
                local env="$1"
                local verb="$2"
                local service="$3"

                local cmd=( docker-compose -f "$env.yml" )

                shift 3 # we've now used up three arguments

                case $verb in
                exec)
                # Execute a command in a running container.
                if [ -n "$service" ]; then
                "$cmd[@]" "$verb" "$service" "$@"
                else
                echo '## Err: You must specify service name...' >&2
                exit 1
                fi
                ;;
                *)
                printf 'Unknown verb: %sn' "$verb" >&2
                exit 1
                esac


                compose_fn "$@"


                I've also used lower-case variable names so that no system or special shell variables are used by accident (ENV is one that some shell uses under some circumstances, for example), and I've removed all unneeded quotes and curly braces.



                I've also put the command into an array, so that we can quote the YAML filename properly.



                You could also just move the setting of the three variables outside of the function, depending on what the rest of the script looks like and if this makes any sense at all. The three variables would then be global in the script.



                #! /bin/bash --

                set -x

                ## docker-compose wrapper
                compose_fn()
                local cmd=( docker-compose -f "$env.yml" )

                case $verb in
                exec)
                # Execute a command in a running container.
                if [ -n "$service" ]; then
                "$cmd[@]" "$verb" "$service" "$@"
                else
                echo '## Err: You must specify service name...' >&2
                exit 1
                fi
                ;;
                *)
                printf 'Unknown verb: %sn' "$verb" >&2
                exit 1
                esac


                env="$1"
                verb="$2"
                service="$3"

                shift 3

                compose_fn "$@"


                You may also bypass the [ -n "$service" ] test with



                service=$3:?'## Err: You must specify service name...'


                The parameter expansion $parameter:?word will exit the shell with the message defined by word if parameter is unset or empty. The bash shell would format this as



                script.sh: line 9: 3: ## Err: You must specify service name...


                Related:



                • When is double-quoting necessary?

                • How can we run a command stored in a variable?

                • Are there naming conventions for variables in shell scripts?






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 1 hour ago

























                answered 1 hour ago









                KusalanandaKusalananda

                143k18267445




                143k18267445



























                    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%2f515342%2fpassing-args-from-the-bash-script-to-the-function-in-the-script%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







                    vj2C TwvA,KcTl082nD2RfA3tkiUO5Ec,E
                    KLfi26Ud5ZgoEeP Xts3Dr3 VFzHpS2v1Cg dklVE,vPVf iQbIHZZSXpCvOEHxC8 3l0L7G,8,6

                    Popular posts from this blog

                    What is the result of assigning to std::vector::begin()? The Next CEO of Stack OverflowWhat are the differences between a pointer variable and a reference variable in C++?What does the explicit keyword mean?Concatenating two std::vectorsHow to find out if an item is present in a std::vector?Why is “using namespace std” considered bad practice?What is the “-->” operator in C++?What is the easiest way to initialize a std::vector with hardcoded elements?What is The Rule of Three?What are the basic rules and idioms for operator overloading?Why are std::begin and std::end “not memory safe”?

                    Creating centerline of river in QGIS? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Finding centrelines from polygons in QGIS?Splitting line into two lines with GRASS GIS?Centroid of the equator and a pointpostgis: problems creating flow direction polyline; not all needed connections are drawnhow to make decent sense from scattered river depth measurementsQGIS Interpolation on Curved Grid (River DEMs)How to create automatic parking baysShortest path creation between two linesclipping layer using query builder in QGISFinding which side of closest polyline point lies on in QGIS?Create centerline from multi-digitized roadway lines Qgis 2.18Getting bathymetric contours confined only within river banks using QGIS?

                    SQL Server 2016 - excessive memory grant warning on poor performing query The Next CEO of Stack OverflowFix for slow SQL_INLINE_TABLE_VALUED_FUNCTIONLarge memory grant requestsPoor performing Query -Tsql execution plan - estimated number of rows =1 Paste the PlanMSSQL - Query had to wait for memory grantRow estimates always too lowBad performance using “NOT IN”Warning about memory “Excessive Grant” in the query plan - how to find out what is causing it?Optimizing table valued function SQL ServerWhen does SQL Server warn about an Excessive Memory Grant?Warning in Execution Plan