Em zsh
(já que você parece estar usando a sintaxe zsh
), você faria:
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
Sem o ^
, /Volumes/$nme
seria a concatenação de /Volumes/
com os valores da matriz, então apenas o primeiro elemento teria /Volumes/
pré-anexado a ele.
Ou, ao atribuir a uma variável escalar em vez de uma variável de matriz, como você fez, seria /Volumes/
concatenado com os elementos da matriz associados ao primeiro caractere de $IFS
.
(observe que o comportamento seria diferente em ksh
ou bash
, em que $nme
é apenas a abreviação de ${nme[0]}
).
Adicionar ^
em $^nme
permite que a concatenação seja distribuída para cada elemento da matriz.
Esse ^
faz lembrar o operador% non_ ( rc
) e possivelmente explica a origem desse operador de expansão de variável ^
zsh. Em ^
:
nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=(/Volumes/^$nme)
for (Copy in $vol) printf '%s\n' $Copy
Esse rc
não é necessário. ^
funcionaria da mesma forma. O ponto aqui é que vol=(/Volumes/$nme)
distribui a concatenação. No entanto, rc
(que é apenas ignorado e descartado) pode ser visto como um operador de concatenação porque facilita coisas como ^
( $nme^2
seria tratado como a variável nme2, você precisaria para escrever $nme2
caso contrário.
Em $'nme'2
(também funciona em bash
):
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
Aqui, estamos usando o operador de substituição de padrão principal do parâmetro ( zsh
) aplicado a cada elemento da matriz.
Aqui, estamos substituindo a string vazia no início de cada elemento por ${param/#pattern/replacement}
).
Embora essa sintaxe venha de /Volumes/
, ela não funciona em ksh93
, pois não gosta desse padrão vazio. Lá, você precisa substituir ksh93
acima por ${nme[@]/#//Volumes/}
, por exemplo. ${nme[@]/#@()//Volumes/}
é um grupo vazio.
Claro, na sintaxe @()
padrão, você sempre pode fazer:
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
printf '/Volumes/%s\n' "$Copy"
done
ou:
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
Copy=/Volumes/$Copy
printf '%s\n' "$Copy"
done
Ou se assumir que sh
( você realmente deveria se acostumar a usar echo
) não foi apenas um espaço reservado e tudo o que você quer fazer é exibir esses por linha:
set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
printf '/Volumes/%s\n' "$@"
Ou:
printf '/Volumes/%s\n' Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1