Esta solução deve ajudá-lo:
#!/bin/bash
opts=(a b "c d");
select opt in "${opts[@]}"
do echo $opt;
break;
done
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'
#?
Use uma matriz:
opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done