Can we unshift the positional params?  I have a complex function that has shifts throughout and at one point there's a while loop: shift while [ "$1" ]; do     if [ a ]; then b; c  fi     if [ d ]; then e; f  fi     if [ g ]; then h; i  fi ... shift done ... works fine, but I'm thinking to restructure it: shift while [ "$1" ]; do     if [ a ]; then b; c; continue fi     if [ d ]; then e; f; continue fi     if [ g ]; then h; i; continue fi ... shift done ... because only one 'if' test will be relevant per loop and the remaining 'if' tests might even do some bad stuff.  The problem of course is that if I 'continue', the final 'shift' is missed.  I could do this: # shift while [ "$2" ]; do     shift     if [ a ]; then b; c; continue fi     if [ d ]; then e; f; continue fi     if [ g ]; then h; i; continue fi ... # shift done ... except that the leading (commented) 'shift' might happen in any number of places and changing them all would be troublesome.  It can be done of course, but I'm wondering if we have some way of  faking this: shift unshift while [ "$1" ]; do     shift     if [ a ]; then b; c; continue fi     if [ d ]; then e; f; continue fi     if [ g ]; then h; i; continue fi ... # shift done ... it looks pointless above, however note that the leading 'shift' might in fact have happened in any one of several different places all of which would need to be reworked and it's fragile, so the 'unshift' would take care of it in one place, at least temporarily.  I know we don't have an official unshift, but can it be faked?  Of course there's also this:     ...     if [ a ]; then b; c; shift; continue fi     ... ... but I'm wondering about a more succinct logic.  The quick and dirty 'unshift' idea would solve a temporary problem very nicely.