
구분 기호에 대한 변경을 셸이 아닌 다음 echo 명령으로만 제한하고 싶습니다.
$ myarr=(1 2 3)
$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3
배열 확장 시 구분 기호가 작동하지 않는 이유는 무엇입니까? 감사해요.
답변1
POSIX에서,~에 관하여$*
:
필드 분할이 수행되지 않는 상황에서 확장이 발생하는 경우 초기 필드는 하나 이상의 문자가 포함된
IFS
경우 변수 의 첫 번째 문자로 구분되거나 ifIFS
가 설정되지 않거나 null 문자열로 설정된 경우 구분이 없습니다 .<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
남자 배쉬에서 :
@
... 큰따옴표 내에서 확장이 발생하면 각 매개변수는 별도의 단어로 확장됩니다. 그건,"$@"은 "$1" "$2"와 동일합니다....*
... 큰따옴표 안에 확장이 발생하면 다음과 같은 단일 단어로 확장됩니다.IFS 특수 변수의 첫 번째 문자로 구분된 각 매개변수의 값. 그건,"$*"는 "$1c$2c..."와 동일합니다., 여기서 c는 IFS 변수 값의 첫 번째 문자입니다.
위의 설명은 위치 매개변수에 대한 것이지만 배열 확장에도 적용됩니다.