Сценарий Bash - для цикла с несколькими аргументами и awk

Я пытаюсь написать сценарий BASH для исправления моих серверов CentOS. Моя цель состоит в том, что когда я запускаю скрипт, он выводит имя пакета, текущую установленную версию и новую версию пакета. Что-то вроде этого:

nspr.x86_64 / 4.8.8-3.el6 / 4.8.9-3.el6_2

Таким образом, если мне когда-нибудь понадобится понизить версию из-за того, что пакет что-то сломал, у меня будет запись об этом.

Команда command yum check-update дает мне первую часть информации (имя пакета) и третью часть информации (новую версию), перечисленные выше, и я могу использовать awk, чтобы разделить их. После этого легко; просто запустите rpm -q {package}, чтобы получить вторую часть информации, а затем соедините их.

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

Вот мой код:

for package in `/usr/bin/yum --cacheonly --noplugins check-update | awk '{print $1, $2}'`;
do
    OLD_VER=`rpm -q ${package}` # ${package} should actually be $1 from the awk statement above

    NEW_VER=${2} # This is $2 from the awk statement above

    echo "${package} / ${OLD_VER} / ${NEW_VER}"
done

Простите за очевидные ошибки в коде; Я новичок в сценариях BASH. Моя путаница в основном связана с awk; Я не очень хорошо знаком с ним и с тем, как он взаимодействует со сценарием BASH. Тем не менее, я думаю, понятно, что я пытаюсь сделать. package передается как массив? Есть лучший способ сделать это?


person Scott Crooks    schedule 05.03.2012    source источник
comment
одним из решений было бы сделать все это в awk   -  person Karoly Horvath    schedule 05.03.2012


Ответы (2)


вы хотите прочитать всю строку:

 /usr/bin/yum --cacheonly --noplugins check-update |
 while read line; do
   set - $line;
   echo first: $1 second: $2
 done
person Karoly Horvath    schedule 05.03.2012
comment
Вы должны позволить read выполнить расщепление; yum ... | while read first second; do ... - person tripleee; 05.03.2012

Попробуй это:

/usr/bin/yum --cacheonly --noplugins check-update \
    | awk '{package=$1; newVer=$2; cmd = "rpm -q " package; cmd | getline oldVer; close(cmd); print package " / " oldVer " / " newVer}'

Проблема с вашим скриптом заключалась в том, что, хотя и bash, и awk используют $ для ссылки на переменные, они являются разными переменными, и вы не можете ссылаться на $2 awk из bash или наоборот. Написание всего в awk или bash должно решить проблему.

person Michał Kosmulski    schedule 05.03.2012
comment
Есть ли способ сделать это с моим текущим скриптом, используя set ? Я только что нашел этот пример: tldp.org/LDP/abs/html/loops1. html Если вы посмотрите, в примере 11-2 используется команда set для разделения входных строк. - person Scott Crooks; 05.03.2012
comment
Да, set $(yum ... | awk ...) очень просто. Но while read может быть более элегантным и читабельным. - person tripleee; 05.03.2012