Надеется, что это помогает:
Решение 1
$ foo=('foo bar' 'foo baz' 'bar baz')
$ foo=("${foo[@]/%/)|(}") #appending ')|('
$ i="${#foo[@]}" #Taking array count.
$ i=$((i - 1)) #i points to the final array element
$ foo[$i]="${foo[$i]%)|(}" # Removing ')|(' attached to the final element
$ final="${foo[*]}" # storing array as string with space separated values
$ final="${final//\(/(}" #stripping the whitespace after '('
$ $ echo "$final" # and that is your result.
foo bar)|(foo baz)|(bar baz
Решение 2
Хорошо, это было бы более простое решение, я думаю,
$ foo=('foo bar' 'foo baz' 'bar baz')
$ final="$(printf "%s)|(" "${foo[@]}")"
$ final="${final%)|(}"
$ echo "$final"
foo bar)|(foo baz)|(bar baz
Примечание
printf "%s)|(" "${foo[@]}"
нужны объяснения я думаю, так вот это является
"${foo[@]}"
расширяет каждое значение в массиве как отдельное слово.
printf "%s)|("
применяется к каждому из этих слов выше, где )|(
действует как ограничитель
Также проверьте мой другой ответ на [\ [добавление префикса и суффикса к позиционным параметрам \]] (http://stackoverflow.com/a/38558776/ 1620779) – sjsam
Решение 2 не может быть легко обобщено на произвольный разделитель - что, если разделитель содержит символ '%'? – Leon
@Leon Если символ в разделителе имеет особое значение внутри самой строки формата, вы можете префикс его '%'. В этом случае '%%' - это то, что вы ищете. – sjsam