bug-bash
[Top][All Lists]
Advanced

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

Re: More fun with IFS


From: Chris F.A. Johnson
Subject: Re: More fun with IFS
Date: Wed, 30 Jan 2013 02:00:26 -0500 (EST)
User-agent: Alpine 2.00 (LMD 1167 2008-08-23)

On Wed, 30 Jan 2013, Dan Douglas wrote:

Hi everyone, and welcome to another edition of IBOTD (IFS-bug-of-the-day),
featuring everyone's favorite Bourne shell kludge: word-splitting!

On today's episode - inconsistencies within assignments that depend upon
quoting. Though I can't take credit for discovering this -- it was pointed out
to me by some guys on IRC after demonstrating some other stuff.

And a quick test:

function expassign {
        typeset -a a
        a=("$@")
        typeset var asn

        while IFS= read -r asn; do
                IFS=: command eval "$asn"
                printf '%-14s... %s\n' "$asn" "$var"
        done <<\EOF
var=${a[*]}
var="${a[*]}"
var=$*
var="$*"
var=${a[@]}
var="${a[@]}"
var=$@
var="$@"
EOF
}

${ZSH_VERSION+:} false && emulate ksh
expassign one:::two three:::four

Bash output:                              # I think...
var=${a[*]}   ... one   two three   four  # bad

   Looks good to me. It expands to multiple words, just as an unquoted
   $* would do.

var="${a[*]}" ... one:::two:three:::four  # good
var=$*        ... one:::two:three:::four  # good
var="$*"      ... one:::two:three:::four  # good
var=${a[@]}   ... one   two three   four  # bad

   As above.

var="${a[@]}" ... one:::two three:::four  # good
var=$@        ... one   two three   four  # bad

   Ditto.

var="$@"      ... one:::two three:::four  # good

Zsh and pdkshes produce:

one:::two:three:::four

For all of the above, which I think is wrong for the last 4. ksh93 produces:

one:::two three:::four

for the last 4, which I think is correct.



--
   Chris F.A. Johnson, <http://cfajohnson.com/>
   Author:
   Pro Bash Programming: Scripting the GNU/Linux Shell (2009, Apress)
   Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]