여러 변수를 다른 변수 뒤에 넣습니다.

여러 변수를 다른 변수 뒤에 넣습니다.

여러 변수가 다른 변수를 따르도록 하려고 하는데 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( $nme2nme2 변수로 처리되고, 그렇지 않으면 작성해야 함 ) $'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

관련 정보