3
echo $SHELL
/bin/bash

echo $SHELL | wc -c
10

echo ${#SHELL}
9 

The number of characters in $SHELL (e.g. /bin/bash) is 9, so why is the result is 10 when use wc -c?

Ben Whaley
  • 32,811
  • 7
  • 87
  • 85
disney82231
  • 189
  • 1
  • 3
  • 11

2 Answers2

5

It's because of the newline added by echo. When you type:

$ echo $SHELL
/bin/bash
$

echo prints a newline character, which is counted in the wc character count.

On the other hand, ${#SHELL} is a shell expansion. The shell performs the character count using an expansion without the extra newline character since echo hasn't actually run yet. So echo ${#SHELL} actually translates to echo 9. The 9 is printed with a trailing new line added by echo.

Ben Whaley
  • 32,811
  • 7
  • 87
  • 85
1

I'm strongly recommend to use shell expansion. Here ${#SHELL}

Warning with wc -c that count BYTES. Not characters.

If you want to count characters with it, use wc -m

It's very important when you not only use ASCII chars table and an UTF-8 terminal (or whatever multibytes charset) or in I18N context

Try this:

$ x="/x/♤/é/"
$ echo ${#x}
$ echo -n "$x" | wc -c
$ echo -n "$x" | wc -m
Arnaud Valmary
  • 2,039
  • 9
  • 14