James está correto, mas para adicionar mais alguns dados, acho que a melhor maneira de pensar sobre isso é como argumentos para o comando: você pretende que "olá" e "mundo" sejam dois argumentos ou "olá mundo" seja um argumento.
Além disso, aspas duplas permitem a interpretação de mais do que apenas variáveis. Exatamente o que depende do seu shell, mas verifique o histórico de expansão, expansão de chaves e expansão de nome de arquivo.
Também é importante observar que há alguns casos em que você precisa usar os dois tipos de aspas em um único argumento. Lembre-se de que os argumentos (por padrão) são delimitados por espaços em branco; portanto, se você não deixar espaço, ainda estará especificando o mesmo argumento.
O mecanismo de citação única da maioria dos shells não permite caracteres especiais, o que significa que qualquer instância de outra citação única, mesmo que pareça escapar, termina a citação. Portanto, é impossível passar uma sequência com uma citação única dentro de uma sequência de citação única, e você deve usar aspas duplas. Isso pode ser um problema quando você deseja passar um argumento que contém aspas simples e algo que seria interpretado, mas não deseja. Por exemplo, se você deseja passar a string literal "'$ VAR' é uma variável", é necessário fazer o seguinte:
"'"'$VAR'"' is a variable"
Na verdade, é uma concatenação de três strings com escape de aspas:
"'"
'$VAR'
"' is a variable"
ou, com as aspas removidas:
'
$VAR
' is a variable
Na verdade, com a maioria das conchas, você também pode fazer o seguinte:
"'\$VAR' is a variable"
onde a barra invertida (" \
") diz ao shell para aceitar o seguinte caractere literalmente e não fazer nenhuma expansão nele.
Mas há alguns casos em que você acaba fazendo isso da maneira de concatenação de várias cadeias, não que eu possa realmente dar um exemplo agora.