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

0

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

Содержание файла: 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

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

SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION
Nagaraj KS
источник

Ответы:

1

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

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

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

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

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

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

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

${numbers[1]}

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

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

Просто разбить строку на две части, если они связаны одним символом, довольно легко и не требует awk. Cut является основной программой расщепления.

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

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

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

что то же самое. DEST может быть назначен одинаково с обоими методами, но для второго поля.

Гомбай Шандор
источник
awk не использует «then», но ожидает {} вокруг блоков команд if / else, если они содержат более одной команды
Gombai Sándor
Спасибо, больше описания добавлено для точного требования
Nagaraj ks
Спасибо, это работает. Я застрял в этом больше часа, вы сэкономили мое время.
Нагараджи
Рад помочь. Веселитесь с этим!
Гомбай Шандор
cp -f / 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 Ранее я пытался прочитать вышеуказанную строку из файла и выполнить команду, но всегда получаю сообщение об ошибке "строка 21: / src / main / res / drawable / logo_splash.png: Нет такого файла или каталога "
Nagaraj ks