Shelley Shelley - 7 months ago 48
Bash Question

Delete positional parameters in Bash?

You can skip positional parameters with

shift
but can you delete positional parameters by passing the position?

x(){ CODE; echo "$@"; }; x 1 2 3 4 5 6 7 8
> 1 2 4 5 6 7 8


I would like to add CODE to
x()
to delete positional parameter 3. I don't want to do
echo "${@:1:2} ${@:4:8}"
. After running CODE,
$@
should only contain "1 2 4 5 6 7 8".

Answer

The best way, if you want to be able to pass on the parameters to another process, or handle space separated parameters, is to re-set the parameters:

$ x(){ echo "Parameter count before: $#"; set -- "${@:1:2}" "${@:4:8}"; echo "$@"; echo "Parameter count after: $#"; }
$ x 1 2 3 4 5 6 7 8
Parameter count before: 8
1 2 4 5 6 7 8
Parameter count after: 7

To test that it works with non-trivial parameters:

$ x $'a\n1' $'b\b2' 'c 3' 'd 4' 'e 5' 'f 6' 'g 7' $'h\t8'
Parameter count before: 8
a
1 2 d 4 e 5 f 6 g 7 h   8
Parameter count after: 7

(Yes, $'\b' is a backspace)