ZSH 매개변수 확장 플래그가 이 문자열에 적용되지 않는 이유는 무엇입니까?

ZSH 매개변수 확장 플래그가 이 문자열에 적용되지 않는 이유는 무엇입니까?

매개변수 확장 플래그는 u고유한 배열 값만 출력해야 합니다. 때로는 그렇습니다.

$ stuff=(a b a c)
$ echo ${(u)stuff}
a b c
$ cat <<< ${(u)stuff}
a b a c

무엇을 제공합니까?

답변1

에서는 배열의 고유한 3개 요소가 전달됩니다(빈 요소는 생략됨) echo ${(u)stuff}. echo당신은 간단한 명령에 대한 인수를 가져오는 목록 컨텍스트에 있습니다.

$ printf '"%s"\n' ${(u)stuff}
"a"
"b"
"c"

그러나 <<<목록이 아닌 컨텍스트 이후에는 cat표준 입력이 하나만 있고 표준 입력을 <<<구성하기 위해 임시 파일에 저장할 항목이 하나만 있으므로 cat배열의 요소는 의 첫 번째 문자와 연결됩니다 $IFS. 동일:

echo "$stuff"
scalar=$stuff
[[ $stuff = x ]]
case $stuff... in
...

모든 경우에 하나의 매개변수만 예상되며 더 많은 매개변수는 의미가 없습니다.

여기서는 다음을 수행하면 충분합니다.

cat <<< ${${(u)stuff}}

먼저 플래그를 적용 u하고 외부 레이어에서 연결을 만듭니다.

동일:

scalar=${${(u)stuff}}

그러나 다음이 필요합니다.

$ printf '"%s"\n' "${${(@u)stuff}}"
"a b c"

내부 확장의 목록 컨텍스트를 강제로 적용하고 외부 확장에서 IFS 조인을 수행하여 printf.

$IFS예를 들어 전역 매개변수에 의존하기보다는 배열 요소가 연결되는 방식을 명시적으로 지정할 수 있습니다.

printf '"%s"\n' ${(j[ ])${(u)stuff}}
cat <<< ${(j[ ])${(u)stuff}}

보다확장규칙더 알아보기.

관련 정보