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

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

1 ответ1

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. вырезать является основной программой расщепления.

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .