Shell Guarde los valores de los elementos de la matriz en las variables.

Shell Guarde los valores de los elementos de la matriz en las variables.

Necesito copiar los archivos de una carpeta a otra, aquí la información de origen y destino está en el archivo de texto.

Contenido del archivo: 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\ prueba\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png

Aquí estoy tratando de dividir la cadena con el delimitador "=" y asignarla a las variables respectivas. Y es necesario activar el comando de copia.

Para lograr lo anterior, estoy tratando de dividir la cadena en una matriz y asignar el valor del elemento de índice de la matriz a las variables locales.

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]}

obteniendo error como

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

y para echo Obteniendo salida como

+ echo

+ echo

@Gombai Sandor, cambié lo anterior según lo sugerido por usted y funciona.

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

Respuesta1

Estás mezclando if [...] ... elif [...] ... fila sintaxis de Shell en el código de awk. awk usaría

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

en este contexto.

Además, espera que la matriz de awk aparezca aquí en el shell principal de awk.

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

Esto no sucederá. Puede escribir cadenas en awk y analizar esa salida en el shell, ya que awk (o cualquier otro programa) no alterará su entorno de llamada.

Donde se indica el error de sintaxis es otra mezcla:

${numbers[1]}

es una referencia de elemento de matriz bash... en un código awk (casi tiene algún significado para awk, pero sugiero no forzar esto).

Recomendaría describir QUÉ es exactamente su tarea y pedir sugerencias porque CÓMO desea resolverla aquí y explicar por qué no funcionará será un poco largo. Pero antes que nada, debes digerir que shell (y su lenguaje) es una cosa y awk (y su lenguaje) ejecutándose dentro de él es otra. Tienen elementos similares pero eso es SÓLO similitud.

Simplemente dividir una cadena en dos partes si están conectadas mediante un solo carácter es bastante fácil y no requiere awk. cut es el programa de división básico.

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

colocará el primer campo en FUENTE donde los campos están separados por = en la entrada decortar Ocasionalmente, puedes encontrar códigos como,

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

que es lo mismo. DEST se puede asignar de manera similar con ambos métodos pero apuntando al segundo campo.

información relacionada