On Wed, Dec 01, 2010 at 08:14:49AM -0500, ste...@syslang.net wrote:
>       IFS=':' set -- aa:bb:cc:dd

>       Instead, I have to say something like:
>       oldIFS="$IFS"
>       IFS=':'
>       set -- aa:bb:cc:dd
>       IFS="$oldIFS"

Neither one of these sets $1 to aa, $2 to bb and so on.  They both set
$1 to aa:bb:cc:dd.  IFS is not applied to a constant string, ever.  It
is only applied to word-splitting that happens on various substitutions
(and lines of input handled by `read').

You probably fooled yourself by failing to quote $1 when you expanded it:

imadev:~$ IFS=:
imadev:~$ set -- aa:bb:cc:dd
imadev:~$ echo $1
aa bb cc dd
imadev:~$ echo "$1"
aa:bb:cc:dd

IFS is applied to the unquoted $1.

Now, let's pretend you asked a totally different question:

  "I am trying to do this:

    x=aa:bb:cc:dd
    IFS=: set -- $x

  Why doesn't IFS cause $x to be split into four words here?"

Here, IFS is not applied because the substitution of $x is performed
*before* the temporary environment is set up with IFS=: in it.
See http://mywiki.wooledge.org/BashFAQ/104 for a more wordy explanation.

Reply via email to