Why there is a difference between the output of 'echo $VAR | wc -c' and 'echo ${#VAR}'?

I'm working on a Bash script and the length of the string contained in a certain variable is one of my conditions. The current string is W5u7TBTzF17GGFV8DBJHvgAAAAI. Initially I've count the string length by the help of wc -c:

$ VAR='W5u7TBTzF17GGFV8DBJHvgAAAAI'; echo "$VAR" | wc -c
28

But my script condition [[ ${#VAR} -eq 28 ]] never pass. Then I decided to count the characters on by one. Indeed the string length is 27 characters, also the value of ${#VAR} is 27:

$ echo "${#VAR}"
27

So I'm in wondering - where does this difference come from?


It's the way echo works. Now do

echo koko

You get

georgek@georgek-HP-Pavilion-17-Notebook-PC:~$ echo koko
koko

But do echo -n koko and you get

georgek@georgek-HP-Pavilion-17-Notebook-PC:~$ echo -n koko
kokogeorgek@georgek-HP-Pavilion-17-Notebook-PC:~$

So wc is capturing the newline character too. Use

echo -n "${VAR}" | wc -c

To get the desired result. The echo command will add the newline character, so that gets counted too. To remove this and get the real count use the -n option.