今天看到有人用 Bash 实现了 join、map 和 filer 函数(可惜没有 reduce 函数),觉得很有趣,所以记录下来
join 函数
join() { { local indelimiter; indelimiter="${1- }" ; local outdelimiter;
outdelimiter="${2-.}" ; }
local car
local cdr
local IFS
IFS="${indelimiter}"
read -t 1 car cdr || return
test "${cdr}" || { echo "${car}" ; return ; }
echo "${car}${outdelimiter}${cdr}" | ${FUNCNAME} "${indelimiter}"
"${outdelimiter}"
}
map 函数
map() { { local function_name ; function_name="${1}" ; }
local car
local cdr
local IFS
IFS="${indelimiter- }"
read -t 1 car cdr || return
test "$( declare -f ${function_name} )" || return
test "${car}" || { true ; return ; }
${function_name} ${car}
echo "${cdr}" | ${FUNCNAME} "${function_name}"
}
filter 函数
filter() { { local function_name ; function_name="${1}" ; }
local car
local cdr
local IFS
IFS="${indelimiter- }"
read -t 1 car cdr || return
test "$( declare -f ${function_name} )" || return
test "${car}" || { true ; return ; }
${function_name} "${car}" || echo -n "${car} "
echo "${cdr}" | ${FUNCNAME} "${function_name}"
}
上面定义的三个函数都遵循一个模式:
参照这个模板的,我们也可以很容易定义出 reduce 函数
reduce() { { local function_name ; function_name="${1}" ; }
local first
local second
local cdr
local IFS
IFS="${indelimiter- }"
read -t 1 first second cdr || return
test "$( declare -f ${function_name} )" || return
test -n "${second}" || { echo ${first} ; return ; }
first=$(${function_name} ${first} ${second})
echo "${first}${IFS}${cdr}" | ${FUNCNAME} "${function_name}"
}
我们来测试一把
source ~/bin/autoload/reduce.sh
sum()
{
expr $1 \+ $2
}
echo {1..4} |reduce sum
10
