Chciałbym użyć podstawienia zmiennej na określonym ciągu, do którego uzyskuję dostęp za pomocą polecenia. Na przykład, jeśli skopiuję coś do schowka, mogę uzyskać do tego dostęp w ten sposób.
$ xclip -o -selection clipboard
Here's a string I just copied.
Jeśli przypiszę ją do zmiennej, będę mógł na niej podstawiać zmienne.
$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.
Czy jednak istnieje sposób na podstawienie zmiennej bez przypisywania jej do zmiennej? Koncepcyjnie coś takiego.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Ta składnia kończy się niepowodzeniem, ponieważ var
powinna to być nazwa zmiennej, a nie ciąg znaków.
bash
. (I popycha mnie ponownie w stronę migracji dozsh
.)Tak, możesz to zrobić - w pewnym sensie. To naprawdę nie jest ładne. Jest bardziej podobny do wbudowanego niż zagnieżdżonego. Problem polega na tym, że musisz operować wartością parametru, który rozwijasz - jeśli ten parametr nie ma wartości, nie zrobisz wiele. Możesz więc przypisać wartość podczas jej rozwijania i nie jest to skrót.
Używam
$0
rozszerzenia param w łańcuchu, aby ukryć przypisanie. Przypisuje wartość var w zagnieżdżonym rozszerzeniu przypisania. Zewnętrzne ma pierwszeństwo - ale ponieważ po prostu rozszerzyłoby się na cokolwiek wewnętrznego, to trudno powiedzieć. Jeśli jednak wyciszymy wewnętrzną ekspansję, a następnie zmodyfikujemy ją, możesz dostać to, czego chcesz. Po skopiowaniu łańcucha do mojego schowka (nie mamxclip
- tylkoxsel
) drukuje:Jest jednak trochę jaśniejsze, co się dzieje, jeśli
$0
się pominie:To drukuje:
... ponieważ przypisanie wewnętrzne występuje przed modyfikacją, ale, jak wspomniano, przypisanie zewnętrzne ma pierwszeństwo - i rozszerza się zarówno na rozszerzenie przypisania wewnętrznego, jak i na zmodyfikowane rozszerzenie wewnętrzne.
Oczywiście nic z tego nie działa, jeśli parametr docelowy jest już przypisany - więc możesz to zrobić tylko wtedy, gdy opróżnisz zmienną w pierwszej kolejności ... co, szczerze mówiąc, jest to prawdopodobnie najwygodniejszy czas na przypisanie jej w końcu .
źródło
alias
pośrednią funkcję, aby uczynić ją trochę wygodniejszą - ale jeśli jest to dla ciebie warte, powinieneś skonfigurować funkcję do obsługi bezpiecznego cytowania i robienia czegoś w /eval
lub czegoś podobnego. w /eval
- jeśli możesz sprawić, że pierwsze znaki wyjściowego polecenia sub będą sprowadzały się do praktycznej składni rozszerzenia - to prawdopodobnie możesz dostać się znacznie dalej. Wiem, że taka rzecz byłaby łatwa w /xsel
- wymaga stdin - alexsel
?Jeśli nie chcesz tworzyć zmiennej, istnieją inne sposoby na zastąpienie łańcucha:
źródło
sed
zamiast tego mogę użyć , ale miało to być bardziej ogólne pytanie dotyczące zagnieżdżania podstawień.