map() { local f="$1"; shift; local k="$1"; shift; local i=$#; while let i--; do local a="$1"; shift set -- "$@" $($f "$a") done $k "$@" } # uc() { echo $1 | tr a-z A-Z; } # map uc echo a b c mapcall() { ___cont="$1"; shift; ___cmd="$1"; shift; ___max=$#; for ((i=0; i<___max; ++i)); do set -- "$@" "$(eval "$___cmd")"; shift; done; "$___cont" "$@" } #mapcall echo 'basename $1' a/b c/d e/f