Uma variável no Bash que contém aspas e espaços

1

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.

    
por Yaron Cohen-Tal 08.08.2015 / 13:31

2 respostas

4

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.

    
por 08.08.2015 / 14:35
4

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:

  • "foo
  • 1 "
  • "foo
  • 2 "

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.

    
por 08.08.2015 / 13:49