Shell Salva os valores dos elementos da matriz nas variáveis

Shell Salva os valores dos elementos da matriz nas variáveis

Preciso copiar os arquivos de uma pasta para outra, aqui as informações de origem e destino estão no arquivo texto.

Conteúdo do arquivo: res.txt

/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ teste\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png

Aqui estou tentando dividir a string com o delimitador "=" e atribuindo-a às respectivas variáveis. E é necessário acionar o comando de cópia.

Para realizar o que foi dito acima, estou tentando dividir a string em uma matriz e atribuir o valor do elemento de índice da matriz às variáveis ​​locais

lines=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
SOURCE=""
DEST=""
echo $lines | awk '{split($0,numbers,"=")} END {
for(n in numbers){
   if (n == 1) { 
      SOURCE = ${numbers[1]}
   }
   else if (n == 2) {
      DEST= ${numbers[2]}
   }
}}'
echo ${numbers[1]}
echo ${numbers[2]}

recebendo erro como

awk: {split($0,numbers,"=")} END {for(n in numbers){ SOURCE = ${numbers[1]}}
awk:                                                           ^ syntax error

e para echo Obtendo saída como

+ echo

+ echo

@Gombai Sandor, mudei o acima conforme sugerido por você e funciona.

SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION

Responder1

Você está misturando a sintaxe do shell if [...] ... elif [...] ... ficom o código do awk. awk usaria

if (...) {
   ...
} else if (...) {
   ...
}

nesse contexto.

Além disso, você espera que o array do awk apareça no shell pai do awk aqui

echo ${numbers[1]}
echo ${numbers[2]}

Isso não acontecerá. Você pode escrever strings no awk e analisar essa saída no shell, colocando o awk (ou qualquer outro programa) para não alterar seu ambiente de chamada.

Onde o erro de sintaxe é indicado é outra mistura:

${numbers[1]}

é uma referência de elemento de array bash... em um código awk (quase tem algum significado para awk, mas sugiro não forçar isso).

Eu recomendaria descrever QUAL é exatamente a sua tarefa e pedir dicas, porque COMO você deseja resolvê-la aqui e explicar por que não funcionará será um pouco longo. Mas antes de tudo você deve digerir que o shell (e sua linguagem) é uma coisa e o awk (e sua linguagem) rodando dentro dele é outra. Eles têm elementos semelhantes, mas isso é APENAS semelhança.

Apenas dividir uma string em duas partes se elas estiverem conectadas por meio de um único caractere é muito fácil e não requer awk. cut é o programa básico de divisão.

SOURCE=$(echo $lines | cut -f1 -d=)

colocará o primeiro campo em SOURCE onde os campos são separados por = na entrada decorte Ocasionalmente, você pode encontrar códigos como,

SOURCE=$(echo $lines | awk -F= '{print $1}')

que é o mesmo. DEST pode ser atribuído de forma semelhante com ambos os métodos, mas visando o segundo campo.

informação relacionada