Why isn't tilde expansion performed on the input to read?

Why has tilde expansion not occurred in the output of this script?

#!/bin/bash

read -p "Enter filename: " fname
if [[ -d $fname ]]
then
        echo "$fname is a directory"
else
        echo "$fname is not a directory"
fi

Output:

$ bash -x test_cd.sh 
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
 ~/Music is not a directory

Solution 1:

That’s simply because read doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME instead and enter

$HOME/Music

or let the script test for ~/ and replace it (taken from this answer):

case "$fname" in "~/"*)
  fname="${HOME}/${x#"~/"}"
esac

You can also use bash Parameter Expansion to replace ~/ with $HOME at the beginning of the string:

if [[ -d ${fname/#~\//$HOME\/} ]]

This variable is expanded before the substitution is performed.