set -u buf="Hello, 'world'!" old() { eval "$(printf '%s' "${buf}" | awk -v FS='' -v j=0 \ -v squote="'" -v esc_squote="'\\\\''" ' { for (i = 1; i <= NF; ++i) { sub(squote, esc_squote, $i); printf("lbufv_%d='\''%s'\''\n", j++, $i); }; printf("lbufv_%d='\''\n'\''\n", j++); } ')" } new() { eval "$(printf '%s' "${buf}" | awk -v FS='' -v j=0 \ -v squote="'" -v esc_squote="'\\\\''" ' { for (i = 1; i <= NF; ++i) { sub(squote, esc_squote, $i); printf("lbufv_%d=" squote "%s" squote "\n", j++, $i); }; printf("lbufv_%d=" squote "\n" squote "\n", j++); } ')" } print_and_clear() { i=0 while [ ${i} -le ${#buf} ]; do c=$(eval "printf '%sx' \"\${lbufv_${i}}\"") eval "lbufv_${i}=" printf 'i: %2d, c: "%s"\n' ${i} "${c%x}" i=$((${i} + 1)) done } old print_and_clear new print_and_clear