IFS의 구분 기호를 어레이 확장에 사용할 수 없는 이유는 무엇입니까?

IFS의 구분 기호를 어레이 확장에 사용할 수 없는 이유는 무엇입니까?

구분 기호 변경 사항을 셸이 아닌 다음 echo 명령으로 제한하고 싶습니다.

$ myarr=(1 2 3)

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

배열 확장에 구분 기호를 사용할 수 없는 이유는 무엇입니까? 감사해요.

답변1

POSIX 관점에서 보면,~에 대한$*:

필드 분할을 수행하지 않는 컨텍스트에서 확장이 발생하는 경우 초기 필드를 연결하여 단일 필드를 형성해야 하며, 각 인수의 값은 변수의 첫 번째 문자( 하나 이상의 문자가 포함된 IFS경우 )로 구분되거나 IFS설정되지 않은 경우 변수이고, <space>빈 문자열로 설정된 경우 구분 기호가 없습니다.IFSIFS

구분 기호를 사용하여 단어를 결합하려면 다음을 $*사용해야 ${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

남자 배쉬에서 :

@
... 큰따옴표 내에서 확장이 발생하면 각 인수가 별도의 단어로 확장됩니다. 그건,"$@"은 "$1" "$2"와 동일합니다....

*
...큰따옴표 안에 확장이 발생하면 단일 단어로 확장됩니다.IFS 특수 변수의 첫 번째 문자로 구분된 각 매개변수의 값. 그건,"$*"는 "$1c$2c..."와 동일합니다., 여기서 c는 IFS 변수 값의 첫 번째 문자입니다.

위의 설명은 위치 매개변수에 대한 것이지만 배열 확장에도 적용됩니다.

관련 정보