Differences between revisions 6 and 12 (spanning 6 versions)
Revision 6 as of 2008-07-04 09:01:07
Size: 883
Editor: pgas
Comment: posix solution with a here string
Revision 12 as of 2009-05-10 03:42:31
Size: 1130
Editor: localhost
Comment: igli: *sigh* BASH handles strings fine. m00 gc ;-)
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[Anchor(faq67)]] <<Anchor(faq67)>>
Line 3: Line 3:
There are a few ways to do this  There are a few ways to do this:
Line 5: Line 6:
   #POSIX    #POSIX, but fails if the variable contains newlines
Line 7: Line 8:
   $var 
   EOF 
   $var
   EOF
Line 11: Line 12:
One can also achieve in bash (and ksh93) using a herestring The easiest and cleanest way is with a bash herestring:
{{{
   read -rd '' x <<< "$x"
}}}
Using an empty string as a delimiter means the read consumes the whole string, as NUL is used. (Remember: BASH only does C-string variables.) This is entirely safe for any text, including newlines.
Line 13: Line 18:
{{{
   # Bash
   # Remove leading whitespace:
   read -r x <<< "$x"
}}}

There's also a solution using [:glob:extglob]:
There's also a solution using [[glob|extglob]] which shows how you can use it in parameter expansion:
Line 35: Line 33:
There are many, many other ways to do this, using sed for instance:   There are many, many other ways to do this, using sed for instance:
Line 37: Line 35:
   # POSIX    # POSIX, suppress the trailing and leading whitespace on every lines
Line 40: Line 38:
These are not necessarily the best, but they're known to work.

How can I trim leading/trailing white space from one of my variables?

There are a few ways to do this:

   #POSIX, but fails if the variable contains newlines
   read -r var << EOF
   $var
   EOF

The easiest and cleanest way is with a bash herestring:

   read  -rd '' x <<< "$x"

Using an empty string as a delimiter means the read consumes the whole string, as NUL is used. (Remember: BASH only does C-string variables.) This is entirely safe for any text, including newlines.

There's also a solution using extglob which shows how you can use it in parameter expansion:

   # Bash
   shopt -s extglob
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
   shopt -u extglob

This also works in KornShell, without needing the explicit extglob setting:

   # ksh
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}

There are many, many other ways to do this, using sed for instance:

   # POSIX, suppress the trailing and leading whitespace on every lines
   x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

BashFAQ/067 (last edited 2025-07-19 12:59:21 by GreyCat)