Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Aug 2007 22:09:24 +0300
From:      Manolis Kiagias <sonicy@otenet.gr>
To:        Rakhesh Sasidharan <rakhesh@rakhesh.com>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Question on the IFS variable (not a FreeBSD question)
Message-ID:  <46BF5AE4.2010206@otenet.gr>
In-Reply-To: <20070812195535.V86618@obelix.home.rakhesh.com>
References:  <20070812195535.V86618@obelix.home.rakhesh.com>

next in thread | previous in thread | raw e-mail | index | archive | help


Rakhesh Sasidharan wrote:
>
> Hi,
>
> This isn't really a FreeBSD question. But I figure most people on this
> list would know the answer and so I'm asking. I've tried to get the
> answer out of Google, but I guess I am not asking it the right
> question and so not getting much hits.
>
> I understand that the default value of the IFS variable in bash is
> "space, tab, newline". For a script I am playing around with, I want
> to change IFS to be just newline. I tried the obvious like
>
> IFS="\n"
> -or-
> IFS='\n'
>
> but that doesn't seem to do the trick coz then the letter "n" ends up
> being the separator.
>
> A bit of Google searching got me the solution too. That I must set IFS
> this way:
>
> IFS=$'\n'
>
> I did that, and sure enough things work the way I want!
>
> So my question is this: how come things work when I set IFS to $'\n'
> instead of just plain '\n'? I don't recollect seeing such a way of
> setting variables before, and so I'm curious about it.
>
> TIA,
> Rakhesh
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to
> "freebsd-questions-unsubscribe@freebsd.org"
>

The IFS=$'\n' is, as you found, correct for bash.
See some details for this in the following post:
http://osdir.com/ml/shells.bash.bugs/2004-10/msg00104.html

Do a little experiment (inspired from the post stated above):
#export IFS="\n"
#printf '<%s>\n' "$IFS" | cat -vt
will give <\n> ==> not what you expect
#export IFS='\n'
#printf '<%s>\n' "$IFS" | cat -vt
will give <\n> ==> again, not what you expect
#export IFS=$'\n'
#printf '<%s>\n' "$IFS" | cat -vt
will give
<
>
definitely a new line character (finally...)
I am not certain of the explanation, but from the above it seems to me
the IFS does not evaluate special '\something' characters unless there
is a $ in front. That is, of course, what you would do to get the value
of a shell variable. It seems then these characters need to be evaluated
in the same way.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46BF5AE4.2010206>