Это объясняется очень хорошо в соответствующем разделе руководства bash. Вкратце, что-либо внутри одинарных кавычек интерпретируется буквально. Итак, например:
$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}
Сравните это с некотируемыми версиями:
$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3
Двойные кавычки допускают расширение переменной (также расширение истории и некоторые другие вещи). В основном, вы используете их, когда имеете дело с чем-то, что вы хотите видеть расширенным. Например:
$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash
Другими словами, одинарные кавычки полностью защищают строку от оболочки, а двойные кавычки защищают некоторые вещи (например, пробелы), но позволяют правильно или интерпретировать переменные и специальные символы.