Re: [man bash] section "Word Splitting" - IFS
From: Chris F.A. Johnson (cfajohnson_at_gmail.com)
Date: 06/22/05
- Next message: juicymixx_at_mailinator.com: "sed question"
- Previous message: Chris F.A. Johnson: "Re: inserting a newline character in a bash (or sh) shell"
- In reply to: nabis: "[man bash] section "Word Splitting" - IFS"
- Next in thread: Eric Moors: "Re: [man bash] section "Word Splitting" - IFS"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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>
- Next message: juicymixx_at_mailinator.com: "sed question"
- Previous message: Chris F.A. Johnson: "Re: inserting a newline character in a bash (or sh) shell"
- In reply to: nabis: "[man bash] section "Word Splitting" - IFS"
- Next in thread: Eric Moors: "Re: [man bash] section "Word Splitting" - IFS"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|