Shell Salve os valores do elemento da matriz nas variáveis

0

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

Conteúdo do arquivo: res.txt

/ var / lib / jenkins / jobs / Android \ Gradle \ teste \ compilação / espaço de trabalho / MainApp / app / src / main / res / drawable-hdpi / logo_splash.png = /var/lib/jenkins/jobs/Android \ Gradle \ test \ build / espaço de trabalho / MainApp / app / src / main / res / drawable / logo_splash.png

Aqui estou tentando dividir a string com o delimitador "=" e atribuí-la às respectivas variáveis. E precisa disparar o comando de cópia.

Para realizar o 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 por eco Obtendo saída como

+ echo

+ echo

@Gombai Sandor, eu mudei o que foi 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
    
por Nagaraj ks 15.04.2016 / 13:43

1 resposta

1

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

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

neste 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 vai acontecer. Você pode escrever strings no awk e analisar que a saída no shell put awk (ou qualquer outro programa) não irá distorcer seu ambiente de chamada.

Onde o erro de sintaxe é indicado é outra mistura:

${numbers[1]}

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

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

Apenas dividir uma string em duas partes, se elas estiverem conectadas através 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 serão separados por = na entrada de cut Ocasionalmente, você pode se deparar com códigos como

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

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

    
por 15.04.2016 / 14:05