Script Bash que chama um programa com alguns asteriscos nos argumentos

0

Eu passei a última hora tentando escrever um roteiro bem simples e nunca me senti tão idiota.

Portanto, tenho uma lista de sequências (que são especificações de seletor de pacotes para um gerenciador de pacotes, se isso for importante) que podem conter asteriscos. Eu preciso construir uma linha de comando preservando esses asteriscos e, em seguida, chamar um programa. Aqui está minha tentativa ingênua:

xs="foo/bar */*"

xs_cmd=""
for x in $xs; do
  xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd

Eu preciso que a chamada echo seja equivalente a

echo   -0 foo/bar    -0 '*/*' 

que gera -0 foo/bar -0 */* .

p. S. Na realidade, a primeira linha é um pouco mais complexa: xs="$some foo/bar */* $(get_others)" .

Se você executar esse script em um diretório contendo a/b , receberá -0 foo/bar -0 a/b .

Quando eu mudo a última linha para

echo "$xs_cmd"  # note the quotes

Eu recebo -0 foo/bar -0 a/b e, em primeiro lugar, isso não é o que eu quero, já que agora estou invocando echo com um argumento único e, além disso, isso me diz que a expansão está acontecendo anteriormente, provavelmente no for loop.

Mas não consigo alterar a linha for porque

for x in "$xs"; do  # note the quotes

só fará o loop repetir uma vez: -0 foo/bar */* (existe um único -0 ) então adicionar essas citações não é uma opção, com certeza.

Agora, se eu voltar ao script original e substituir a primeira linha por

xs="foo/bar '*/*'"  # note additional single quotes

Eu recebo -0 foo/bar -0 '*/*' (as aspas simples não devem estar lá).

Parece que tentei todas as combinações de citações e escapes com aspas invertidas de asteriscos e, literalmente, não faço ideia do que fazer agora.

    
por kirelagin 27.10.2014 / 13:08

2 respostas

0

Eu usei o seu script original, mas com aspas simples na primeira linha (apenas) e funcionou como eu acho que você quer ( -0 antes de cada caminho do arquivo): -

xs='foo/bar */*'

xs_cmd=""
for x in $xs; do
  xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd

Você provavelmente encontrará problemas quando vier a usá-lo se houver espaços em branco incorporados em qualquer um dos caminhos de arquivo. Se assim for, mude o comando no loop para: -

  xs_cmd="$xs_cmd  -0 \"$x\" "
    
por 27.10.2014 / 13:41
0

Dependendo do que você está tentando alcançar, é necessário citar esses */* :

xs="foo/bar '*/*'" #!

xs_cmd=""
for x in $xs ; do
    xs_cmd="$xs_cmd  -0 $x "
done

echo $xs_cmd
eval echo $xs_cmd
eval "echo $xs_cmd"

ou use arrays ou ambos:

xs=("foo/bar" "*/*") #!

xs_cmd=""
for x in "${xs[@]}"; do
    xs_cmd="$xs_cmd  -0 '$x' " #!
done

echo "$xs_cmd"
eval "echo $xs_cmd"
    
por 09.11.2014 / 15:35