2014-01-04 2 views
0

У меня здесь странная проблема. Я думаю, что я на 99%. У меня просто небольшой синтаксис и логическая ошибка где-то при попытке сделать следующее:Bash while loop sed replace

У меня есть файл манифеста с кучей сумм MD5. Не беспокойтесь, суммы просто для сравнения, а не для безопасности. Файл выглядит примерно так:

puppy.cfg=324327437483274834783204723 
kitty.cfg=7893703274r0327403247032472 
etc. 

Функция «Манифест» вызывается и получает значение. Он получает имя файла, которое называется идентификатором (IDA). Затем функция вычисляет текущую сумму этого файла (IDA). Затем он просматривает каждую строку файла манифеста, пока не найдет соответствующий идентификатор файла (IDA = IDB). Когда он находит, что соответствующий ID сравнивает текущую сумму с суммой в файле манифеста (SUMA vs SUMB). Если нет разницы, функция просто закрывается и ничего не делает. Если он обнаруживает разницу, то функция «должна» обновлять файл манифеста «текущей» суммой. Эта часть функции в настоящее время не работает. Он делает что-то странное и смешивает переменные и ничего не меняет. Я знаю, что просто пропустил что-то простое. Может кто-нибудь помочь, пожалуйста?

function MANIFEST.CHECK { 
    local IDA="$1" 
    local SUMA=$(md5sum $1 | cut -d ' ' -f 1) 
    while read LINE; do 
    local IDB="`echo $LINE | cut -d"=" -f1`"; 
    local SUMB="`echo $LINE | cut -d"=" -f2`"; 
    if [ "$IDA" = "$IDB" ]; then 
     if [ ! "$SUMA" = "$SUMB" ]; then 
     while read LINE; do 
      sed "s%$SUMB%$IDA\=$SUMA%" var/manifest 
     done < <(grep -v '#' var/manifest) 
     echo "The file is/was different." 
     return 
     fi 
    fi 
    done < <(grep -v '#' var/manifest) 
} 

### START SCRIPT ### 
MANIFEST.CHECK puppy.cfg 
+0

Просто проверяя, ожидали ли вы, что sed изменит файл «на месте» (то есть, как редактор)? Это не; он просто отправляет измененную копию в stdout. –

+0

Это объясняет, почему я увидел выход «пюре». Хм, я не уверен, куда идти отсюда. Как бы вы порекомендовали заменить одну строку в файле. – Atomiklan

ответ

0

Если я правильно понял, то вы могли бы заменить внутреннюю while петлю с одним sed, как это:

function MANIFEST.CHECK { 
    local IDA="$1" 
    local SUMA=$(md5sum $1 | cut -d ' ' -f 1) 
    while read LINE; do 
    local IDB="`echo $LINE | cut -d"=" -f1`"; 
    local SUMB="`echo $LINE | cut -d"=" -f2`"; 
    if [ "$IDA" = "$IDB" ]; then 
     if [ ! "$SUMA" = "$SUMB" ]; then 
     sed -i "s%$SUMB%$SUMA%" var/manifest 
     echo "The file is/was different." 
     return 
     fi 
    fi 
    done < <(grep -v '#' var/manifest) 
} 

Я хотел бы сделать некоторые другие улучшения тоже, и переписать сценарий, как это:

manifest=var/manifest 
function MANIFEST.CHECK { 
    local IDA="$1" 
    local SUMA=$(md5sum "$1" | cut -d' ' -f1) 
    local IDB SUMB 
    while read LINE; do 
     IFS== read IDB SUMB <<< "$LINE" 
     if [ "$IDA" = "$IDB" ]; then 
      if [ "$SUMA" != "$SUMB" ]; then 
       sed -i "s%$SUMB%$SUMA%" "$manifest" 
       echo "The file is/was different." 
       break 
      fi 
     fi 
    done < <(grep -v '#' "$manifest") 
} 
MANIFEST.CHECK puppy.cfg 
+0

Отличное спасибо. Это сработало. – Atomiklan