O que você deve fazer é usar uma matriz:
mv_params=("foo 1" "foo 2")
mv "${mv_params[@]}"
A expansão da matriz manipulará adequadamente os elementos da matriz com espaço em branco ou caracteres especiais.
Estou tentando o seguinte em um script Bash:
MV_PARAMS='"foo 1" "foo 2"'
mv $MV_PARAMS
O que eu quero realmente executar é:
mv "foo 1" "foo 2"
Mas parece que não funciona. tentando isso:
mv "$MV_PARAMS"
Não funciona também.
Lidar com espaços em branco em nomes de arquivos em scripts de shell é geralmente complicado. Neste caso, dado:
MV_PARAMS='"foo 1" "foo 2"'
Quando você escreve:
mv $MV_PARAMS
Você acaba com o shell executando mv
da seguinte forma:
execve("/usr/bin/mv", ["mv", "\"foo", "1\"", "\"foo", "2\""])
Ou seja, com quatro argumentos:
Você pode usar o comando eval
para que o shell analise a linha de comando gerada:
eval "mv $MV_PARAMS"
Que fará o que você quer. Usar eval
às vezes pode ser complicado e, em situações em que eval
parece ser a solução, muitas vezes tentarei reescrever as coisas para evitar que seja necessário.
Tags bash shell-script quoting variable