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'
#?
Użyj tablicy:
źródło