... ah, I see, you want to just undo a shift. Well, AFAIK you can't do that without manually saving the value that was in $1 before the shift somewhere. Then you can use set to put it back.I haven't read your whole message yet, but to unshift a new value in front of the positional params, all you have to do is this:
set -- "$new" "$@"
And now $1 is "$new", $2 is whatever $1 used to be, and so on.