In this example dash will repeatedly append 'attr=foo' to the list of parameters in an infinite loop: #!/bin/dash -x while getopts :a: arg -a foo -a bar; do case $arg in a) set -- "$@" attr="$OPTARG" esac done shift "$((OPTIND - 1))" Instead I expected this to result in parameter list containing 'attr=foo' and 'attr=bar'. This works in all shells I have been able to test with the exception of busybox sh: * sh (bash) * bash (All versions from 1.14 through 5.1.4) * mksh (MIRBSD KSH R59 2020/05/16) * ksh (93u+) * zsh (5.8) * zsh --emulate sh * heirloom-sh (bourne) The only workaround I've found is to explicitly use `shift 2` in the a) case and obviate the final shift using OPTIND. This will unfortunately break every other shell.