lambda() { # Save orignal function local ORIGINAL=$(declare -f otl) local SHIFT_SIZE=${1} shift local vars=() for ((i=0;i<${SHIFT_SIZE};i++)); do vars+=(${1}) shift done eval "otl() { $@; }" otl ${vars[@]} unset -f otl eval "${ORIGINAL}" } accept_lambda() { declare -a argAry1=("${!1}") echo "${argAry1[@]}" lambda ${argAry1[@]} } test_passing() { echo "Test passing lambda" local lamdef=(3 "test" "lambda" "pass" 'echo $3 $2 $1') echo "Passing ${lamdef[@]}" accept_lambda lamdef[@] } returns_callback(){ lamdef=(3 test call back 'echo $3 $2 $1') echo "${lamdef[@]}" } test_callbacks(){ echo "Test callback" local lamdef=($(returns_callback)) echo "Got callback: ${lamdef[@]}" lambda ${lamdef[@]} } echo "Test lambda call" lambda 3 ro sham bo 'echo $3 $2 $1' test_passing test_callbacks