Hallo Thorsten, I do not know whether you have followed the thread on the standard list, but Robert Elz has written a shell function which allows round-tripping quoted strings from and to the positional parameter stack, Stephane did so in awk(1), effectively we are talking about
stephane_quote() { LC_ALL=C awk -v q="'" -v b='\\' ' function quote(s){ gsub(q, q b q q, s) return q s q } BEGIN{ sep = "" for(i = 1; i < ARGC; i++){ printf "%s", sep quote(ARGV[i]) sep = " " } if(sep) print "" }' "$@" } mksh fails to roundtrip the string set -- x 'a \ b' "foo'" "\\'b\\a\\r\\" A echo "$#: <${1}><${2}><${3}><$4><$5>" saved_parameters=$(robert_quote "$@") eval "set -- $saved_parameters" echo "$#: <${1}><${2}><${3}><$4><$5>" i think, the \r is expanded, the output is \><A><a \ b><foo'><\'b instead of 5: <x><a \ b><foo'><\'b\a\r\><A> Interested in the attached addition to check.t? --steffen | |Ralph says i must not use signatures which spread the light!
diff --git a/check.t b/check.t index e0c8d5e..7cc08d6 100644 --- a/check.t +++ b/check.t @@ -6835,6 +6835,61 @@ expected-stdout: 3 10 . 4 -2147483646 . --- +name: quote-roundtrip +description: + Check roundtrip quoting behaviour via Robert Elz quote() +stdin: + robert__quote() { + case "$1" in + *\'*) ;; + *) printf "'%s'" "$1"; return 0;; + esac + __A__="$1" __S__= __E__= + while case "$__A__" in + \'*) __A__=${__A__#?}; __S__="${__S__}\\\\'";; + *\') __A__=${__A__%?}; __E__="${__E__}\\\\'";; + '') printf "${__S__}${__E__}"; return 0;; + *) false;; + esac + do + continue + done + _save_IFS="${IFS}"; ${IFS+":"} unset _save_IFS + _save_OPTS="$(set +o)" + IFS=\' + set -f + set -- $__A__ + _result_="${1}" + shift + for __A__ + do + _result_="${_result_}'\\''${__A__}" + done + printf "${__S__}'%s'${__E__}" "${_result_}" + # now clean up + IFS="${_save_IFS}"; ${_save_IFS+":"} unset IFS + eval "${_save_OPTS}" + unset _result_ _save_IFS _save_OPTS __A__ __E__ __S__ + return 0; + } + robert_quote() { + j= + for i + do + [ -n "$j" ] && printf ' ' + j=' ' + robert__quote "$i" + done + } + set -- x 'a \ b' "foo'" "\\'b\\a\\r\\" A + echo "$#: <${1}><${2}><${3}><$4><$5>" + saved_parameters=$(robert_quote "$@") + eval "set -- $saved_parameters" + echo "$#: <${1}><${2}><${3}><$4><$5>" +expected-stdout: + 5: <x><a \ b><foo'><\'b\a\r\><A> + 5: <x><a \ b><foo'><\'b\a\r\><A> +--- name: readonly-0 description: Ensure readonly is honoured for assignments and unset