Performing string comparison with carriage return in bash

bash, sh, shell, string

Solution

The following would illustrate how you can determine if the string contains a carriage return:

read a
if [[ $a =~ $'\r' ]]; then
  echo 1;
fi

Executing it by saying:

echo -e "something\r" | bash foo

would return

1

EDIT: If you want to figure whether the last character of a string contains a carriage return, you could say:

if [[ ${a: -1} = $'\r' ]]; then
  echo 1;
fi

Problem

Why does the following code fail in bash? Note, I am trying to perform a more complex comparison such as "somestring\r"; this is just a simplified example. I can confirm that the carriage return "ascii 13" is getting into the script. But I cannot compare against it with a regular string comparison. The expected result is "1" for a positive match. Command line: ``` echo -e "\r" | ./test.sh ``` Script: ``` ord() { printf '%d' "'$1" } read a echo "1st char: $(ord ${a:0:1})" left="${a:0:1}" if [ "$left" = "\r" ]; then echo 1 fi exit 0 ```

Original source