While eval may not be needed for a pop like function, it is however required whenever you use getopt:
Consider the following function that accepts -h as an option:
f()
{
local __me__="${FUNCNAME[0]}"
local argv="$(getopt -o 'h' -n $__me__ -- "$@")"
eval set -- "$argv"
while :; do
case "$1" in
-h)
echo "LOLOLOLOL"
return 0
;;
--)
shift
break
;;
done
echo "$@"
}
Without eval set -- "$argv" generates -h -- instead of the desired (-h --) and subsequently enters an infinite loop because -h -- doesn't match -- or -h.