bash: cómo usar un argumento citado en select

0

De un comando obtengo algunos argumentos que quiero ofrecer al usuario con la instrucción select de bash en un script de shell. Los argumentos proporcionados por el comando pueden contener espacios y, por lo tanto, están protegidos por comillas. Aquí hay un ejemplo simplificado.

Esto funciona como se esperaba:

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

El resultado es el esperado:

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

Pero con la salida del comando en una variable, no funciona como se esperaba:

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

Aunque $ opts contiene lo mismo que la escritura codificada en el primer ejemplo de selección, la salida es diferente:

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

Entonces, no es que bash haya consumido las citas. Se guardan, pero las citas no encapsulan un argumento como lo hicieron cuando las codifiqué. Como ya escribí, obtengo los argumentos como resultado de un comando. Pueden contener espacios y, por lo tanto, ya están protegidos por comillas. ¿Cómo los consigo en una sola pieza para la declaración 'select'? No se trata de comillas simples y dobles. Con comillas simples sucede lo mismo:

1) a
2) b
3) 'c
4) d'
#?
Markus
fuente

Respuestas:

0

Esta solución debería ayudarte a:

#!/bin/bash

opts=(a b "c d");

select opt in "${opts[@]}"
   do echo $opt; 
   break; 
done
podwysoc
fuente
Si, esto funciona. Gracias. Ahora estoy trabajando para obtener la salida del comando de una pieza en $ opts. También allí se divide en elementos de matriz en los espacios, incluso entre comillas.
Markus
0

Use una matriz:

opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done
jcbermu
fuente
Si, eso funciona. Gracias. Es la misma solución que la de @podwysoc
Markus