Почему разделитель из IFS не работает для расширения массива?

Почему разделитель из IFS не работает для расширения массива?

Я хочу ограничить изменение разделителя только следующей командой echo, а не оболочкой:

$ myarr=(1 2 3)

$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3

Почему разделитель не работает для расширения массива? Спасибо.

решение1

Из POSIX,касательно$*:

Если расширение происходит в контексте, где разделение полей не выполняется, исходные поля должны быть объединены в одно поле со значением каждого параметра, разделенным первым символом переменной, IFSесли IFSона содержит хотя бы один символ, или разделенным , <space>если IFSне задано, или без разделения, если IFSзадана пустая строка.

Чтобы объединить слова с помощью разделителя, вам придется использовать $*, или ${array[*]}в bash:

$ set -- word1 word2 word3 "some other thing" word4
$ IFS='|'
$ echo "$*"
word1|word2|word3|some other thing|word4

Или, с массивом в bash:

$ arr=( word1 word2 word3 "some other thing" word4 )
$ IFS='|'
$ echo "${arr[*]}"
word1|word2|word3|some other thing|word4

С вашим кодом:

$ myarr=( 1 2 3 )
$ echo "$( IFS="|"; echo "${myarr[*]}" )"
1|2|3

решение2

Сравнивать:

$ myarr=(1 2 3)
$ printf '%s\n' $( IFS="|"; echo "${myarr[@]}" )
1
2
3
$ printf '%s\n' $( IFS="|"; echo "${myarr[*]}" )
1|2|3

Из man bash:

@
… Когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельного слова. То есть,"$@" эквивалентно "$1" "$2"...

*
… Когда расширение происходит в двойных кавычках, оно расширяется до одного слова сзначение каждого параметра, разделенное первым символом специальной переменной IFS. То есть,«$*» эквивалентно «$1c$2c...», где c — первый символ значения переменной IFS.

Приведенное выше описание относится к позиционным параметрам, но оно применимо и к расширениям массивов.

Связанный контент