Bash scripting
Programming
Coding tips
Linux commands
Variable manipulation

How to trim whitespace from a Bash variable?

Master System Design with Codemia

Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.

Introduction

In Bash, trimming whitespace means removing leading and trailing spaces, tabs, or newlines from a variable while keeping the meaningful middle content intact. The safest approach is usually Bash parameter expansion, because it avoids spawning external tools and behaves well inside scripts once you understand the pattern.

Built-In Bash Trimming

Here is a standard built-in approach:

bash
1var=$'   hello world \t '
2
3trimmed="${var#"${var%%[![:space:]]*}"}"
4trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"
5
6printf '[%s]\n' "$trimmed"

The first line removes leading whitespace. The second removes trailing whitespace. This works without sed, awk, or xargs.

Why Quoting Matters

Always quote the variable when printing or passing it around:

bash
printf '[%s]\n' "$trimmed"

Without quotes, Bash can perform word splitting and pathname expansion, which makes whitespace-related bugs much harder to track down. A trimming routine is not very useful if the next line reintroduces ambiguity.

Using External Tools

Sometimes readability matters more than avoiding subprocesses. sed is a common alternative:

bash
trimmed=$(printf '%s' "$var" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

This is easy to recognize and works well in many scripts, but it is slower than pure parameter expansion if you are doing it repeatedly in tight loops.

awk can also normalize whitespace, though it does more than trim if used carelessly:

bash
trimmed=$(printf '%s\n' "$var" | awk '{$1=$1; print}')

That version rebuilds fields, which may collapse internal runs of spaces. Sometimes that is wanted, sometimes it is not.

Trimming Is Not the Same as Removing All Whitespace

A very common mistake is confusing "trim" with "delete all whitespace." These are different operations. Trimming removes only the edges. Deleting all whitespace changes the content itself:

bash
no_spaces=$(printf '%s' "$var" | tr -d '[:space:]')

That turns "a b" into "ab", which is usually not what you want when the requirement says "trim."

When Newlines Matter

Bash variables can contain newlines as well as spaces and tabs. Using [:space:] instead of plain space characters helps catch those cases. If the input came from command substitution or file reads, trimming with only literal space characters often misses part of the problem.

This is especially common when reading command output. A variable may look normal when echoed to the terminal, but still contain a trailing newline that breaks string comparison or path construction later in the script. That is why trimming should match the real input source, not just the most obvious visible whitespace.

In practical shell scripting, whitespace bugs are often data-source bugs first.

That is why trimming code should be written close to input boundaries. Clean the variable when you read it, not only when a later comparison fails. Doing it early makes the rest of the script simpler and prevents the same whitespace issue from surfacing in three different places.

It also makes later debugging far less noisy.

That habit scales well in larger scripts.

Common Pitfalls

  • Forgetting to quote the variable after trimming.
  • Using awk and accidentally collapsing internal spaces.
  • Confusing trimming with deleting all whitespace.
  • Spawning sed or awk in hot loops when Bash expansion would be faster.
  • Handling only spaces and forgetting tabs or newlines.

Summary

  • Bash can trim whitespace with parameter expansion alone.
  • Quote variables after trimming to avoid word-splitting bugs.
  • 'sed is readable, but Bash built-ins avoid extra processes.'
  • Trimming edges is different from deleting all whitespace.
  • Use [:space:] when tabs or newlines may be present.

Course illustration
Course illustration

All Rights Reserved.