
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 [...] ... fi
com 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.