Цикл вложенности while с циклом for в bash

1
задан Marry Jane 19 February 2019 в 18:42
поделиться

1 ответ

Что я делаю не так?

Во второй попытке вы правильно поняли, что проблема не требует вложенных циклов, но read line < blocks.log неверно, потому что это читает только первая строка неоднократно. Вот исправленная версия с некоторыми замечаниями:

line='' # no line read yet
for i in $wallets; do
    current_blocks=`$i getblockcount`
    coin_name=`basename $i -cli`    # I just prefer it more readable.
    if [ ! "$line" ]; then          # we need to read a line from log
        read line
        set -- $line
    fi
    if [ "$1" == "$coin_name" ]; then
        line='' # read new line next time
        echo "File contains the coin_name, compare the blocks now"
        if (( current_blocks > $2 )); then
            echo "Current blocks are greater than the saved blocks"
            echo "Saving the new blocks count now"
            sed -i "/$1/c$1 $current_blocks" blocks.log
        else
            echo "Current blocks are less than or equal to saved blocks"
        fi
    else
        # $line as well as $1 and $2 remain set, will be used in next loop cycle
        echo "File does not contain the coin_name, adding it now"
        if [ ! "$1" ]; then         # $1 is empty at EOF
            # create a new blocks.log to not disturb reading from original:
            cp blocks.log $; mv $ blocks.log
            echo "$coin_name $current_blocks" >>blocks.log
        else
            # insert before current line (address /$1/)
            sed -i "/$1/i$coin_name $current_blocks" blocks.log
        fi
    fi
done <blocks.log

Обычно мы читаем по одной строке из журнала для каждого кошелька по порядку, таким образом, у нас есть один for i in $wallets цикл с одним read line внутри. Но есть случай, когда со времени последнего скрипта запускается новый накопленный кошелек, которого нет в файле; здесь мы уже прочитали следующую строку кошелька из файла журнала, поэтому мы сохраняем данные этой строки для следующего цикла цикла и не читаем новую строку.

Другим важным моментом является то, что мы не должны изменять файл blocks.log входного во время выполнения цикла - это добавит новые данные к старым данным, смешивая овец и коз. К счастью, sed -i создает новый файл blocks.log output , в то время как старый файл input остается анонимным и без изменений. Только когда мы echo … >>blocks.log, мы сами должны обеспечить создание нового blocks.log.

Обратите внимание, что этот подход требует сортировки кошельков; поскольку все ваши -cli файлы находятся в каталоге /usr/local/bin/, вы можете написать wallets=/usr/local/bin/*-cli вместо строки с find.

0
ответ дан Armali 19 February 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: