Delete positional parameters in Bash?

Viewed 13206

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".

5 Answers

while loop over "$@" with shift + set: move each parameter from first to last position, except "test"

# remove option "test" from positional parameters
i=1
while [ $i -le $# ]
  do
    var="$1"
    case "$var" in
      test)
        echo "param \"$var\" deleted"
        i=$(($i-1))
      ;;
      *)
        set -- "$@" "$var"
      ;;
    esac
    shift
    i=$(($i+1))
done
Related