Я хотел бы использовать подстановку переменных в конкретной строке, к которой я обращаюсь через команду. Например, если я скопирую что-то в буфер обмена, я получу к нему доступ следующим образом.
$ xclip -o -selection clipboard
Here's a string I just copied.
Если я назначу его переменной, то я могу сделать замену переменной на нем.
$ 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.
Тем не менее, есть ли способ сделать подстановку переменной, не назначая ее переменной? Концептуально как то так.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Этот синтаксис не работает, потому что var
должно быть имя переменной, а не строка.
bash
. (И снова подталкивает меня к миграцииzsh
.)Да, вы можете сделать это - вроде. Это действительно не красиво. Это больше похоже на встроенный, чем вложенный. Проблема в том, что вы должны работать со значением раскрываемого параметра - если этот параметр не имеет значения, вы не будете делать много. Таким образом, вы можете присвоить значение при его расширении, и вряд ли это будет ярлык.
Я использую
$0
расширение параметра в цепочке, чтобы скрыть назначение. Он присваивает значение переменной в раскрытии вложенного присваивания. Внешнее имеет приоритет - но потому что оно просто расширится до того, что делает внутренний, трудно сказать. Однако, если мы заглушим внутреннее расширение, то изменив его, вы сможете получить то, что хотите. После копирования вашей строки в мой буфер обмена (у меня нетxclip
- простоxsel
), он печатает:Немного яснее, что происходит, если вы
$0
пропустите:Это печатает:
... потому что внутреннее назначение происходит до модификации, но, как уже было отмечено, внешнее назначение имеет приоритет - и оно распространяется как на расширение внутреннего назначения, так и на модифицированное внутреннее расширение.
Конечно, ничего из этого не работает вообще, если целевой параметр уже назначен - так что вы можете сделать это только уверенно, если сначала очистите переменную ... что, честно говоря, вероятно, самое подходящее время для его назначения после всех ,
источник
alias
косвенное указание, чтобы сделать его немного более удобным - но если оно того стоит, вам следует настроить функцию для обработки безопасных цитат и делать что-то с /eval
или что-то подобное в любом случае. w /eval
- если вы можете сделать первые символы выходной команды command sub равными работающему синтаксису расширения - тогда вы, вероятно, сможете продвинуться намного проще. Я знаю, что такое было бы легко с /xsel
- это требует стандартного ввода - ноxsel
?Если вы не хотите создавать переменную, то есть другие способы выполнения подстановки строк:
источник
sed
вместо этого, но это был более общий вопрос о вложенности подстановок.