Coloca múltiplas variáveis depois de outra variável

2

Tentar ter uma variável múltipla segue outra variável, mas não estou obtendo 7 variáveis VOL diferentes.

NME=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
VOL=/Volumes/${NME}

for Copy in $VOL ; do
    echo $Copy
done
    
por Phil 28.10.2015 / 13:14

1 resposta

2

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
    
por 28.10.2015 / 13:20

Tags