bash: Jak użyć cytowanego argumentu w select

0

Z polecenia otrzymuję kilka argumentów, które chcę zaoferować użytkownikowi z instrukcją select z basha w skrypcie powłoki. Argumenty dostarczone przez polecenie mogą zawierać spacje i dlatego są chronione przez cudzysłowy. Oto uproszczony przykład.

Działa to zgodnie z oczekiwaniami:

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

Wynik jest zgodny z oczekiwaniami:

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

Ale z wyjściem polecenia w zmiennej nie działa zgodnie z oczekiwaniami:

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

Chociaż $ opts zawiera to samo, co wpisane na stałe w pierwszym wybranym przykładzie, wyjście jest inne:

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

Więc to nie tak, że bash pochłaniał cytaty. Są one przechowywane, ale cytaty nie zawierają argumentu, tak jak w przypadku, gdy je mocno zakodowałem. Jak już napisałem, otrzymuję argumenty jako dane wyjściowe polecenia. Mogą zawierać spacje i dlatego są już chronione cudzysłowami. Jak uzyskać je w jednym kawałku do instrukcji „wybierz”? Nie chodzi o pojedyncze i podwójne cytaty. W przypadku pojedynczych cytatów dzieje się to samo:

1) a
2) b
3) 'c
4) d'
#?
Markus
źródło

Odpowiedzi:

0

To rozwiązanie powinno Ci pomóc:

#!/bin/bash

opts=(a b "c d");

select opt in "${opts[@]}"
   do echo $opt; 
   break; 
done
podwysoc
źródło
Tak, to działa. Dzięki. Pracuję teraz nad uzyskaniem wyniku polecenia w jednym kawałku do $ opts. Również tam jest podzielony na elementy tablicy w przestrzeniach nawet między cudzysłowami.
Markus
0

Użyj tablicy:

opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done
jcbermu
źródło
Tak, to działa. Dzięki. To takie samo rozwiązanie jak w @podwysoc
Markus