여러 변수가 다른 변수를 따르도록 하려고 하는데 7개의 다른 VOL 변수가 표시되지 않습니다.
NME=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
VOL=/Volumes/${NME}
for Copy in $VOL ; do
echo $Copy
done
답변1
zsh
(구문을 사용하는 것 같으므로 ) zsh
다음을 수행합니다.
nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=(/Volumes/$^nme)
for Copy in $vol; do
printf '%s\n' $Copy
done
그렇지 않은 경우 ^
배열의 값과 연결되므로 /Volumes/$nme
첫 번째 요소만 추가됩니다./Volumes/
/Volumes/
또는 앞서 했던 것처럼 배열 변수 대신 스칼라 변수에 할당하면 의 /Volumes/
첫 번째 문자와 연결된 배열 요소와 연결됩니다 $IFS
.
ksh
(또는 에서는 동작이 달라집니다 bash
. 이는 $nme
의 약어일 뿐입니다 ${nme[0]}
.)
연결 허용 ^
에 추가됨$^nme
분산화배열의 각 요소에.
이는 ^
(not) 연산자를 연상시키며 zsh의 변수 확장 연산자의 유래를 rc
설명할 수 있습니다 . 존재하다 :^
^
rc
nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=(/Volumes/^$nme)
for (Copy in $vol) printf '%s\n' $Copy
그건 ^
필요하지 않습니다. vol=(/Volumes/$nme)
효과는 동일합니다. 여기서 중요한 점은 rc
연결이 실제로 분산된다는 것입니다. 그러나 ^
(단순히 무시되고 폐기됨) 다음과 같이 볼 수 있습니다.연결 연산자$nme^2
( $nme2
nme2 변수로 처리되고, 그렇지 않으면 작성해야 함 ) $'nme'2
과 같은 작업 에 도움이 되기 때문입니다 .
( 에도 bash
적용됨 zsh
):
nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=("${nme[@]/#//Volumes/}")
for Copy in "${vol[@]}"; do
printf '%s\n' "$Copy"
done
여기서는 ${param/#pattern/replacement}
배열의 각 요소에 적용된 인수 선행 패턴 대체 연산자( )를 사용합니다. 여기서는 각 요소의 시작 부분에 있는 빈 문자열을 )로 바꿉니다 /Volumes/
.
해당 구문은 에서 나왔지만 빈 패턴을 좋아하지 않기 때문에 ksh93
작동하지 않습니다 . 거기에서 위의 내용을 다음 과 같이 바꿔야 ksh93
합니다 . 은(는) 빈 그룹입니다.${nme[@]/#//Volumes/}
${nme[@]/#@()//Volumes/}
@()
물론 표준 sh
구문에서는 항상 다음과 같이 할 수 있습니다.
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
printf '/Volumes/%s\n' "$Copy"
done
또는:
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
Copy=/Volumes/$Copy
printf '%s\n' "$Copy"
done
또는 echo
(printf
실제로 사용하는 데 익숙해져야 합니다.)는 단순한 자리 표시자가 아니며, 다음과 같은 자리 표시자를 한 줄에 표시하기만 하면 됩니다.
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
printf '/Volumes/%s\n' "$@"
또는:
printf '/Volumes/%s\n' Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1