[email protected] bash - программирование" />

Добавьте префикс и суффикс в [email protected] bash

Как добавить суффикс и префикс к [email protected]?

Если я делаю $PREFIX/[email protected]/$SUFFIX, я получаю префикс и суффикс только в первом параметре.

Ответ 1

Я бы использовал shell [расширение параметра] для этого

set -- one two three
echo "[email protected]"
one two three
set -- "${@/#/pre}" && set -- "${@/%/post}"
echo "[email protected]"
preonepost pretwopost prethreepost

Примечания

  • # соответствует началу
  • % соответствует концу
  • Использование двойных кавычек вокруг ${@} рассматривает каждый элемент как отдельное слово. поэтому замена происходит для каждого позиционного параметра

Ответ 2

Создайте параметры для тестовых целей:

$ set -- one two three
$ echo "[email protected]"
one two three

Теперь, используйте bash для добавления префиксов и суффиксов:

$ IFS=$'\n' a=($(printf "pre/%s/post\n" "[email protected]"))
$ set -- "${a[@]}"
$ echo -- "[email protected]"
pre/one/post pre/two/post pre/three/post

Ограничения: (a) поскольку это использует строки, разделенные символом строки, это не сработает, если ваш [email protected] содержит новые строки. В этом случае может быть еще один выбор для IFS, который будет достаточным. (b) Это подлежит глобированию. Если одна из этих проблем является проблемой, см. Более общее решение ниже.

С другой стороны, если позиционные параметры не содержат пробелов, то никаких изменений в IFS не требуется.

Кроме того, если IFS изменено, тогда можно предварительно сохранить IFS и восстановить его позже.

Более общее решение

Если мы не хотим делать какие-либо предположения о пробеле, мы можем изменить "$ @" с помощью цикла:

$ a=(); for p in "[email protected]"; do a+=("pre/$p/post"); done
$ set -- "${a[@]}"
$ echo "[email protected]"
pre/one/post pre/two/post pre/three/post

Ответ 3

Примечание. Это по существу немного более подробная версия sjam answer.

ответ John1024 полезен, но:

  • требует подоболочку (которая включает дочерний процесс)
  • может привести к нежелательному globbing, примененному к элементам массива.

К счастью, параметр Bash может быть применен и к массивам, что позволяет избежать этих проблем:

set -- 'one' 'two' # sample input array, which will be reflected in [email protected]

# Copy [email protected] to new array ${a[@]}, adding a prefix to each element.
# `/#` replaces the string that follows, up to the next `/`,
# at the *start* of each element.
# In the absence of a string, the replacement string following
# the second `/` is unconditionally placed *before* each element.
a=( "${@/#/PREFIX}" )

# Add a suffix to each element of the resulting array ${a[@]}.
# `/%` replaces the string that follows, up to the next `/`,
# at the *end* of each element.
# In the absence of a string, the replacement string following
# the second `/` is unconditionally placed *after* each element.
a=( "${a[@]/%/SUFFIX}" )

# Print the resulting array.
declare -p a

Это дает:

declare -a a='([0]="PREFIXoneSUFFIX" [1]="PREFIXtwoSUFFIX")'

Обратите внимание, что двойные ссылки на ссылки на массивы имеют решающее значение для защиты своих элементов от потенциального расщепления слов и глобализации (расширение имени файла) - оба из которых являются экземплярами расширения оболочки.