D2=`echo $D | sed 's/\./\\\\./g'`
echo $D2
Подумайте о снарядах, повторно сканирующих строку при каждом ее выполнении. Таким образом, у echo $ D1, в котором есть экранированные символы, экранированные переменные применяются к значению при разборе строки, прежде чем echo увидит его. Решение еще больше ускользает.
Правильное экранирование вложенных операторов оболочки может сделать вас интересными.