Мне нужно скопировать файлы из одной папки в другую, здесь информация об источнике и месте назначения находится в текстовом файле.
Содержимое файла: 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 можно назначить аналогичным образом с помощью обоих методов, но нацелившись на второе поле.