diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el index 3ede701..0a691e2 100644 --- a/lisp/ob-shell.el +++ b/lisp/ob-shell.el @@ -106,6 +106,30 @@ This function is called by `org-babel-execute-src-block'." ;; helper functions +(defun org-babel-variable-assignments:bash_array (varname values &optional sep hline) + "Returns a list of statements declaring the values as a bash array." + (format "declare -a %s=( \"%s\" )" + varname + (mapconcat 'identity + (mapcar + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) + values) + "\" \""))) + +(defun org-babel-variable-assignments:bash_associative (varname values &optional sep hline) + "Returns a list of statements declaring the values as bash associative array." + (format "declare -A %s\n%s" + varname + (mapconcat 'identity + (mapcar + (lambda (items) + (format "%s[\"%s\"]=%s" + varname + (org-babel-sh-var-to-sh (car items) sep hline) + (org-babel-sh-var-to-sh (cdr items) sep hline))) + values) + "\n"))) + (defun org-babel-variable-assignments:sh (params) "Return list of shell statements assigning the block's variables." (let ((sep (cdr (assoc :separator params))) @@ -114,9 +138,17 @@ This function is called by `org-babel-execute-src-block'." "hline")))) (mapcar (lambda (pair) - (format "%s=%s" - (car pair) - (org-babel-sh-var-to-sh (cdr pair) sep hline))) + (if (and (string= org-babel-sh-command "bash") (listp (cdr pair))) + (if (listp (car (cdr pair))) + (org-babel-variable-assignments:bash_associative + (car pair) (cdr pair) sep hline) + (org-babel-variable-assignments:bash_array + (car pair) (cdr pair) sep) hline) + (format "%s=%s" + (car pair) + (org-babel-sh-var-to-sh (cdr pair) sep hline)) + ) + ) (mapcar #'cdr (org-babel-get-header params :var))))) (defun org-babel-sh-var-to-sh (var &optional sep hline)