Ответы:
Кажется, bash не использует $ IFS для объединения сгенерированных слов. Другой метод - хранить сгенерированные слова в массиве, и тогда $ IFS будет в игре:
Я собираюсь использовать подоболочку, чтобы не изменять IFS этой оболочки: выберите один из
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Это испускает разделенную запятыми строку в стандартный вывод. Если вы хотите захватить это:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Я уверен, что есть много способов сделать это. Вот один из методов:
echo a{b,c,d} | sed 's/ /,/g'
Разверните элементы, как вы показали, а затем зациклите их, добавив запятую ко всем, кроме первой итерации:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Результат:
ab, ac, ad
Смотрите замену параметров bash .
Вот решение только для bash.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
Часть перед точкой с запятой присваивает ab ac ad
переменной, IN
а вторая часть использует поиск и замену, чтобы заменить все пробелы на запятые. //
Означает , что все матчи, а не только первый.
Сделайте все это в подоболочках (в скобках), чтобы не загрязнять пространство имен.
Стоит отметить, что во многих случаях в таком списке допустима запятая. Если допустимая запятая является приемлемой, самый простой способ выполнить замену printf
:
some-command "$(printf %s, a{b,c,d} )"
(Где some-command
команда, которая выполняется в списке, разделенном запятыми, и не заботится о запятой.)
На самом деле, даже если у вас не должно быть запятой, вы можете использовать printf
; вам просто нужно указать ожидаемое количество аргументов, что делает его неуклюжим для очень длинных списков:
some-command "$(printf %s,%s,%s a{b,c,d} )"