I've seen a few examples of this function over the years, here's a recent variant of mine (I'm accepting the use of eval here):
# Provide 'up', so instead of e.g. 'cd ../../../' you simply type 'up 3'
up() {
case "${1}" in
(*[!0-9]*) : ;;
("") cd || return ;;
(1) cd .. || return ;;
(*) cd "$(eval "printf -- '../'%.0s {1..$1}")" || return ;;
esac
pwd
}