LinuxForum.Fans
Тема

[Срочно][BASH] Сравнение двух строк, записанных в разных переменных

Автор: ds_ev3rest 11 сообщений 5730 просмотров
#374251

Доброго времени суток. Имеются файлы .o, по содержимому которых надо определить зависимость одного файла .o от другого, причем выписать зависимости на stdout в виде файл1 -> файл 2 (признак зависимости). Для этого нужно использовать инструмент nm, разрешается только один файл TEMP. Что делаю я:

Записываю имена всех файлов в переменную в виде строки (имена отделены пробелом).
Далее делаю цикл, в первую переменную проводится операция nm для каждого файла и выбираются лишь U признаки (имена неопределенных функций), в этом же цикле во временный файл делаю аналогичную операцию, но записываю лишь T признаки (определенные функции).
Итого мы имеем в список функций в разных местах. Как их наиоптимальнейшим способом сравнить между собой и в случае совпадения посредством if вывести на stdout?

Код:

text
#!/bin/bash
TEMP=`mktemp /tmp/$USER.XXXXXX`
var=`ls *.o`

for name in $var do u=`nm $name | grep -e '\<U\>' | awk '{print $2}'` done

for name in $var do nm $name | grep -e '\<T\>' | awk '{print $3} done > $TEMP

#а вот здесь пытаюсь сравнить, но не получается.. for u1 in $u do while read line; do if [ "$u1" == "$line"]; then echo "It Works!" else echo "Error" fi done done < $TEMP

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

#374256

Вам нужно нечто вроде

text
#!/bin/bash

for i in *.o; do U=$(nm $i | grep -e '\<U\>' | awk '{print $2}' ) for j in *.o; do T=$(nm $j | grep -e '\<T\>' | awk '{print $3}) if [ "x$T" == "x$U" ] ; then echo "Match: $i => $j" fi done done

?

#374260

Такую вещь я уже пробовал (насколько я помню, после конвеера запускается в субшелле, переменная остается локальной). Переделал данный Вами код на следующий, в итоге выводит Error.

text
#!/bin/bash

for i in *.o; do U=$(nm $i | grep -e '\<U\>' | awk '{print $2}' ) for j in *.o; do T=$(nm $i | grep -e '\<T\>' | awk '{print $3}') if [ "$T" == "$U" ] ; then echo "Match: $i => $j" else echo "Error" fi done done

#374261

Добавьте вывод переменных до сравнения, что получится?

text
echo "\$T=$T"
#374262

Добавил в код
закомментил if

в итоге имеем:


А вот если в $TEMP писать через

text
#!/bin/bash
var=`ls *.o`

for name in $var do for i in $name; do nm $i | grep -e '\<U\>' | awk '{print $2}' done done > $TEMP

то содержимое $TEMP:

#374266

Виноват, во втором цикле из скрипта в сообщении 2 вместо for i ... должно быть for j ... Соответственно, в вызове nm нужно передавать в первом цикле i, во втором - j.

#374268

Это я заметил ранее, заменил на J, все равно та же проблема..


С этим я уже бился, ничего путного не вышло. Вот как бы сделать сравнение строк из одного цикла со строками из $TEMP (за счет while read line)?
То есть мы имеем все U функции в $TEMP, а вот как их корректно сравнить с j, которое постоянно меняется? Два вложенных цикла?

#374270

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

#374272

Хорошо. Давайте сделаем немного по другому. Я сделал вывод всех U в $TEMP, а всех T в переменную, принимающей каждый раз новое значение в цикле. Сам код:

text
#!/bin/bash
TEMP=`mktemp /tmp/$USER.XXXXXX`
 
for file in $(ls *.o)
do
nm $file | grep -e '\<U\>' | awk '{print $2}'
done > $TEMP
 
cat $TEMP | sort
echo "-------------------------"
 
for file1 in $(ls *.o)
do
u=`nm $file1 | grep -e '\<T\>' | awk '{print $3}'`
for j in $u; do
  echo $j
             done
done

Сделал вывод:


Теперь вся загвоздка в том, как это все сравнить в цикле или в чем еще..

#374274

Тут задача не тупо сравнить строки, тут нужно еще и корелляцию со сравниваемыми файлами делать. Иначе мы не сможем сказать "вот этот файл зависит от того, а вон тот - от во-о-он того".
То есть, берем файл, получаем из него список неопределенных функций, берем другой файл и из него - список определенных функций. Если хотя бы одна функция в списке доступных есть, рисуем стрелочку... Получается, нужно грепать список доступных на предмет неопределенных, и с каждым проходом новое значение подставлять...

#374275
"yars" написал:
То есть, берем файл, получаем из него список неопределенных функций, берем другой файл и из него - список определенных функций. Если хотя бы одна функция в списке доступных есть, рисуем стрелочку...

Именно так, Вы правильно поняли. И в скобках еще необходимо указать саму функцию

Начал делать это при помощи цикла, но пока нет полностью картины. У Вас есть идеи?

Войдите или зарегистрируйтесь, чтобы ответить.