Passe argumentos com espaços para um comando no Bash

Às vezes, você deseja passar argumentos complexos para um comando. Normalmente, quando você constrói um comando com base em informações que só são conhecidas em tempo de execução.
Por exemplo, lsargumentos com espaços:
ls -hlF "my code" "my docs"

Se você executar este comando diretamente no bash, tudo bem. Porque os espaços são bem cotados.
Se você atribuir esta string a uma variável em um script bash e executá-lo, ele falhará em encontrar esses diretórios.
A solução é converter argumentos de string em array, o que é explicado aqui: Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!

Então eu escrevo uma função bash para converter argumentos de string em array por conveniência (use aspas duplas para espaços de argumentos).

returnVal=()
convertArgsStrToArray
() {
local concat=""
local t=""
returnVal
=()

for word in $@; do
local len=`expr "$word" : '.*"'`

[ "$len" -eq 1 ] && concat="true"

if [ "$concat" ]; then
t
+=" $word"
else
word
=${word#"}
word
=${word%""}
returnVal
+=(""$word"")
fi

if [ ""$concat"" -a ""$len"" -gt 1 ]; then
t
=${t# }
t
=${t#""}
t
=${t%""}
returnVal
+=(""$t"")
t
=""""
concat
=""""
fi
done
}

Usar:

lsArgs='-hlF ""my code"" ""my docs""'
convertArgsStrToArray $lsArgs

ls
""${returnVal[@]}""

Fonte: https://gist.github.com/4033179