Re: [man bash] section "Word Splitting" - IFS

From: Chris F.A. Johnson (cfajohnson_at_gmail.com)
Date: 06/22/05


Date: Tue, 21 Jun 2005 23:37:28 -0400

On 2005-06-21, nabis wrote:
> Hi!
> I am translating man 1 bash in my native languge. There is a somewhat confu-
> sing explanation (at leas for me) of IFS varible in EXPANSION section, Word
> Splitting subsection. I'll quote it here:
>
> > Word Splitting
> > The shell scans the results of parameter expansion, command substitu-
> > tion, and arithmetic expansion that did not occur within double
> > quotes for word splitting."
> example:
> var="a b c"
> echo $var
>
> > The shell treats each character of IFS as a delimiter, and splits the
> > results of the other expansions into words on these characters. If
> > IFS is unset, or its value is exactly <space><tab><newline>, the
> > default, then any sequence of IFS characters serves to delimit words.
>
> this is clear.
>
> > If IFS has a value other than the default, then sequences of the
> > whitespace characters space and tab are ignored at the beginning and
> > end of the word, as long as the whitespace character is in the value
>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > of IFS (an IFS whitespace character).
>
> that means, *unless the witespace character is back in the value of IFS*
>
> > Any character in IFS that is
> > not IFS whitespace, along with any adjacent IFS whitespace charac-
> > ters, delimits a field.
>
> I think, I got it:
> IFS=":;"
> var="a:;b;::c"
> echo $var # a b c
>
>
> Now the part that I can barely understand:
>
> > A sequence of IFS whitespace characters is
> > also treated as a delimiter. If the value of IFS is null, no word
> > splitting occurs.
>
> > Explicit null arguments ("" or '') are retained. Unquoted implicit
> > null arguments, resulting from the expansion of parameters that have
> > no values, are removed. If a parameter with no value is expanded
> > within double quotes, a null argument results and is retained.
> >
> > Note that if no expansion occurs, no splitting is performed.
>
> Could someone, please, expand this last part, add a few examples.

    Multiple adjacent whitespace characters are considered a single
    delimiter, but multiple non-whitespace characters each delimit a
    field.

    In your example, "a:;b;::c" contains 6 fields, including 3 empty
    fields. But "a:;b c" contains only 3 ("a", "", and "b c") or 4 if
    you add a space to IFS.

    You can see the splitting more clearly if you use printf instead
    of echo:

printf "%s\n" $var

-- 
    Chris F.A. Johnson                     <http://cfaj.freeshell.org>
    ==================================================================
    Shell Scripting Recipes: A Problem-Solution Approach, 2005, Apress
    <http://www.torfree.net/~chris/books/cfaj/ssr.html>


Relevant Pages

  • [man bash] section "Word Splitting" - IFS
    ... sing explanation of IFS varible in EXPANSION section, ... then any sequence of IFS characters serves to delimit ... > whitespace characters space and tab are ignored at the ...
    (comp.unix.shell)
  • Re: Lengthy merge code
    ... Do any of your data fields contain any of the delimiter characters (i.e. the ... the chances are that the problem has nothing to do with memory. ... proprietary software package - I don't dare name it - and the merge ...
    (microsoft.public.word.mailmerge.fields)
  • Re: URLScan
    ... You state that "The delimiter of the log file is defined by W3C ... whitespace, not space characters: ...
    (microsoft.public.inetserver.iis.security)
  • awk question
    ... delimiter) is, eg, exactly 5 lower case characters ... If ";" is the delimiter character, ... Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. ... Handelsregister: Registergericht Muenchen, HRA 74606, Geschäftsfuehrung: ...
    (freebsd-questions)
  • Re: Variable width fixed width text files
    ... 2003 are 69 characters long. ... dynamically set the file/column properties for each file before ... Doing so you will always see only one variable lenght column delimited by the Row delimiter. ... ' Visual Basic Transformation Script ...
    (microsoft.public.sqlserver.dts)

Loading