Подстановка команд с заменой строки

Можно ли сделать что-то вроде:

echo ${$(ls)/foo/bar}

Я почти уверен, что видел где-то рабочий пример чего-то подобного, но это приводит к ошибке «плохая замена».

Я знаю, что есть и другие способы сделать это, но такая короткая вставка была бы полезна. Я что-то упускаю или это невозможно?


person Łukasz    schedule 10.05.2015    source источник
comment
Что именно вы хотите сделать?   -  person Zulu    schedule 10.05.2015


Ответы (3)


Синтаксис ${...} допускает только ссылку на переменную (или позиционный параметр), при необходимости в сочетании с расширение параметра.

Синтаксис $(...) (или, что менее предпочтительно, его эквивалент в старом стиле, `...`), выполняет подстановка команд, которая позволяет встраивать произвольные команды в чей выход stdout выражение расширяет.

Таким образом, вы можете объединить две функции следующим образом:

echo "$(lsOutput=$(ls); echo "${lsOutput//foo/bar}")"

Обратите внимание на несложное вложенное использование $(...), что является одним из основных преимуществ по сравнению с `...`, использование которого здесь потребовало бы экранирования.

Тем не менее, любые переменные, которые вы определяете внутри подстановки команд, ограничены подоболочкой, в которой команда выполняется в любом случае, поэтому вы можете обойтись только командой, которая производит желаемый выход , учитывая, что важен только вывод stdout.

echo "$(ls | sed 's/foo/bar/')"
person mklement0    schedule 10.05.2015

Вы можете использовать канал | с sed, например:

$ echo ABC | sed 's/B/_/'
A_C

Или подстановка переменных, все объясняется здесь, и особенно в разделе "Переменная расширение/замена подстроки», а ниже пример от меня:

$ var=ABC
$ echo ${var//B/_}
A_C
person Zulu    schedule 10.05.2015

Почему бы просто не

root@localhost:~# echo `pwd`_whatever_suffix
/root_whatever_suffix
person franzisk    schedule 11.09.2019