#!/usr/bin/env bash # Example for how #29 can get implemented. cd "$(dirname "$0")" # Go to the script's directory foreach() { # Trying to use unique names local foreachSourceName foreachIterator foreachEvalString foreachContent foreachContent=$(cat) if [[ "$2" != "as" && "$2" != "in" ]]; then echo "Invalid foreach - bad format." elif [[ "$(declare -p "$1")" != "declare -"[aA]* ]]; then echo "$1 is not an array" else foreachSourceName="${1}[@]" for foreachIterator in "${!foreachSourceName}"; do foreachEvalString=$(declare -p "$foreachIterator") foreachEvalString="declare -A $3=${foreachEvalString#*=}" eval "$foreachEvalString" echo "$foreachContent" | mo done fi } # The links are associative arrays declare -A resque hub rip resque=([name]=Resque [url]=http://example.com/resque) hub=([name]=Hub [url]=http://example.com/hub) rip=([name]=Rip [url]=http://example.com/rip) # This is a list of the link arrays links=(resque hub rip) # Source mo in order to work with arrays . ../mo # Process the template cat <<EOF | mo --allow-function-arguments Here are your links: {{#foreach links as link}} * [{{link.name}}]({{link.url}}) {{/foreach}} EOF