bash: Como usar um argumento entre aspas em select

0

De um comando recebo alguns argumentos que desejo oferecer ao usuário com a instrução select do bash em um shell script. Os argumentos fornecidos pelo comando podem conter espaços e, portanto, são protegidos por aspas. Aqui está um exemplo simplificado.

Isso funciona como esperado:

select opt in a b "c d"
do
  echo $opt
  break
done

A saída é a esperada:

1) a
2) b
3) c d
#? 

Mas com a saída do comando em uma variável, isso não funciona como esperado:

opts="a b \"c d\""
select opt in $opts
do
  echo $opt
  break
done

Embora $ opts contenha o mesmo que a digitação codificada no primeiro exemplo de seleção, a saída é diferente:

1) a
2) b
3) "c
4) d"
#?

Então não é que o bash consumiu as citações. Eles são mantidos, mas as citações não encapsulam um argumento como quando eu as codifiquei. Como já escrevi, recebo os argumentos como saída de um comando. Eles podem conter espaços e, portanto, já estão protegidos por citações. Como faço para obtê-los em uma peça para a declaração 'select'? Não é sobre aspas simples e duplas. Com aspas simples, o mesmo acontece:

1) a
2) b
3) 'c
4) d'
#?
    
por Markus 29.12.2014 / 15:06

2 respostas

0

Esta solução deve ajudá-lo:

#!/bin/bash

opts=(a b "c d");

select opt in "${opts[@]}"
   do echo $opt; 
   break; 
done
    
por 29.12.2014 / 15:37
0

Use uma matriz:

opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done
    
por 29.12.2014 / 15:30