Re: Arrays

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Steven Penny wrote in <CAAXzdLUeByjci1nxvo34gJR=UU26n6d2CPr11p6M7Rb_eNXC\
cg@xxxxxxxxxxxxxx>:
 |On Mon, May 27, 2019 at 12:12 PM Steffen Nurpmeso wrote:
 |> Actually only one.  Because that works on all shells i have
 |> tested, even on SunOS 5.9 /bin/sh.  If you do not care about
 |> portability why not use mksh or bash directly (in the shebang)?
 |
 |I am not interested in a brittle function that leaks variables into \
 |the global
 |scope:
 |
 |    $ quote_rndtrip aa
 |    'aa'
 |
 |    $ echo "[$i]"
 |    [aa]
 |
 |    $ echo "[$j]"
 |    [ ]
 |
 |I am interested in having Dash source code modified such that it supports \
 |arrays
 |natively. If you have a patch for that I would be interested, thank you.

Oh yeah, that is surely my fault then, not kre's.  That thus needs
to be changed, let's enclose the outer driver(s) with subshell(s)
here -- local variables are unfortunately not truly portable
either.

How about the following, including s///g changes for better names?

  #!/bin/sh -
  #@ Round trip quote strings in POSIX shell.  E.g.,
  #@    set -- x 'a \ b' "foo'" "\\'b\\a\\r\\" Aä
  #@    printf "%s: <%s><%s><%s><%s><%s>\n" "$#" "${1}" "${2}" "${3}" "$4" "$5"
  #@    saved_parameters=`quote_rndtrip "$@"`
  #@    eval "set -- $saved_parameters"
  #@    printf "%s: <%s><%s><%s><%s><%s>\n" "$#" "${1}" "${2}" "${3}" "$4" "$5"
  #
  # Public Domain
  
  # Though slower use a subshell version instead of properly restoring $IFS
  # and flags, as elder shells may not be able to properly restore flags via
  # "set +o" as later standardized in POSIX, and it seems overkill to handle
  # all possible forms of output "set +o" may or may not actually generate.
  quote__rndtrip() (
     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}"; exit 0;;
        *) false;;
        esac
     do
        continue
     done
     IFS=\'
     set -f
     set -- $a
     r="${1}"
          shift
     for a
     do
        r="${r}'\\''${a}"
     done
     printf "${s}'%s'${e}" "${r}"
     exit 0
  )
  
  quote_rndtrip() (
     j=
     for i
     do
        [ -n "$j" ] && printf ' '
        j=' '
        quote__rndtrip "$i"
     done
  )
  
  quote_string() (
     j=
     for i
     do
        [ -n "$j" ] && printf '\\ '
        j=' '
        quote__rndtrip "$i"
     done
  )

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux