Delete positional parameters in Bash?
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 8Parameter count before: 81 2 4 5 6 7 8Parameter 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: 8a1 2 d 4 e 5 f 6 g 7 h 8Parameter count after: 7
(Yes, $'\b'
is a backspace)
x(){ #CODE params=( $* ) unset params[2] set -- "${params[@]}" echo "$@"}
Input:x 1 2 3 4 5 6 7 8
Output:1 2 4 5 6 7 8
From tldp
# The "unset" command deletes elements of an array, or entire array.unset colors[1] # Remove 2nd element of array. # Same effect as colors[1]=echo ${colors[@]} # List array again, missing 2nd element.unset colors # Delete entire array. # unset colors[*] and #+ unset colors[@] also work.echo; echo -n "Colors gone." echo ${colors[@]} # List array again, now empty.