Bash functional
From wikinotes
Fancy loops that let you process things incrementally in a pipeline.
You'll almost never use these directly, but it might be inspiration for a more useful function.
Filter
# Call callable/params($*), passing each each STDIN line as the last parameter # # EXAMPLE: # divisible_by_2() { [ $(($1 % 2)) -eq 0 ] } # echo {1..10} | tr ' ' '\n' | filter divisible_by_2 # #> 2 # #> 4 # #> ... # filter() { local input while read -r input; do if "$@" "${input}" 2>&1 > /dev/null ; echo "${input}" fi done }
Map
NOTE:
If your callable accepts parameter as stdin, you don't need map (ex. grep/sed work just fine from stdin).
you could also do this using xargs instead.# Call callable/params($*), passing each each STDIN line as the last parameter # # EXAMPLE: # divisible_by_2() { # [ $(($1 % 2)) -eq 0 ] && echo "$1:yes" || echo "$1:no" # } # echo {1..10} | tr ' ' '\n' | map divisible_by_2 # #> 1:no # #> 2:yes # #> ... # map() { local input while read -r input; do "$@" "${input}" done }
Reduce
# callable/params must accept aggregate as 2nd-last param, and input as last param. # # EXAMPLE: # sum() { echo $(($1 + $2)) } # echo {1..10} | tr ' ' '\n' | reduce sum 0 # #> 55 # reduce() { local callable="${@:1:-1}" # all until last param local aggregate="${@[-1]}" # last param local input while read -r input; do aggregate="$("${callable[@]}" "${aggregate}" "${input}")" done echo "${aggregate}" }