Originally published at derk-jan.com. I have recently taken up writing, again and am trying to commit to at least one helpful post each week for the next 52 weeks.
For one of my CLIs, I needed to remove the first argument from the argument list and forward the rest to a next process. In this example, my shell script is called cli_process
and given arguments arg1
, arg2
and arg3
, I want to execute forward_process
with arg2
and arg3
.
#!/usr/bin/env bash
# Documentation on @
# https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#index-_0040
# Documentation on shift [n]
# https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#index-shift
# Why quoting the argument is "necessary":
# https://stackoverflow.com/questions/4824590/propagate-all-arguments-in-a-bash-shell-script/4824637#4824637
# eats 1 argument
shift 1
# forwards the rest to "forward_process"
forward_process "$@"
Originally posted as a gist, by myself.
Windows
Windows .bat
files support a similar token: %*
, which is equivalent to $@
.
However, the SHIFT
command, unlike the bash equivalent shift
, doesn't modify this special token. There are various solutions that will attempt to eat the first n
parameters, but all of them have edge-cases in which they don't properly work. Should you need this in windows, I recommend you write out the arguments manually %2
, %3
(and skip %1
).
Here you can find some Windows solutions, but make sure you check the comments underneath each one:
- StackOverflow (935609): batch parameters: everything after %1
- StackOverflow (761615): Is there a way to indicate the last n parameters in a batch file?
Resources
-
Bash documentation for
@
-
Bash documentation for
shift
- StackOverflow (4824590) on why you need the "quotes" around "@\$"
Want these short articles in your e-mail? 📧 Sign up for my newsletter.
Top comments (2)
Heh... if you're someone that implements flag/args in bash, you're familiar with
shift
because it's how you parsegetopt
strings.Absolutely! But when I needed to do this, I did not have that knowledge yet. Only needed to drop an argument and pass it on to the next binary :).
Shift is great