매개변수 확장 플래그는 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}}
보다확장규칙더 알아보기.