Shell Сохраняет значения элементов массива в переменных

Shell Сохраняет значения элементов массива в переменных

Мне нужно скопировать файлы из одной папки в другую, здесь информация об источнике и месте назначения находится в текстовом файле.

Содержимое файла: 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\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png

Здесь я пытаюсь разделить строку с помощью разделителя "=" и присвоить ее соответствующим переменным. И нужно вызвать команду копирования.

Чтобы выполнить вышеизложенное, я пытаюсь разбить строку на массив и присвоить значение элемента индекса массива локальным переменным.

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

получаю ошибку как

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

и для echo Получение вывода как

+ echo

+ echo

@Gombai Sandor, я изменил вышеизложенное, как вы предложили, и это работает.

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

решение1

Вы смешиваете if [...] ... elif [...] ... fiсинтаксис оболочки с кодом awk. awk будет использовать

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

в данном контексте.

Кроме того, вы ожидаете, что массив awk появится в родительской оболочке awk здесь

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

Этого не произойдет. Вы можете писать строки в awk и анализировать этот вывод в оболочке, помещая awk (или любую другую программу), которая не будет искажать свою вызывающую среду.

Там, где указана синтаксическая ошибка, находится другая смесь:

${numbers[1]}

является ссылкой на элемент массива bash... в коде awk (она имеет какое-то значение для awk, но я предлагаю не навязывать это).

Я бы рекомендовал описать, ЧТО именно представляет собой ваша задача, и попросить подсказок, потому что КАК вы хотите ее решить здесь, и объяснять, почему это не сработает, будет немного долго. Но прежде всего вы должны усвоить то, что shell (и ее язык) - это одно, а awk (и его язык), работающий внутри нее, - это другое. У них есть похожие элементы, но это ТОЛЬКО сходство.

Разделить строку на две части, если они соединены одним символом, довольно просто и для этого не требуется awk. cut — это базовая программа для разделения.

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

поместит первое поле в SOURCE, где поля разделены знаком = во входных данныхрезать Иногда вы можете столкнуться с такими кодами, как:

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

что одно и то же. DEST можно назначить аналогичным образом с помощью обоих методов, но нацелившись на второе поле.

Связанный контент