Code in Bits and Pieces

Forward arguments in shell

April 11, 2020 • ☕️ 2 min read

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:

Resources