Что я делаю не так?
blockquote>Во второй попытке вы правильно поняли, что проблема не требует вложенных циклов, но
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
.
Не используйте ключевое слово New в операторе dim. Вы говорите ему создать экземпляр класса, когда это необходимо, но тогда вы никогда не обратитесь к нему снова, поэтому он никогда не понадобится. Вместо этого:
Public MySheetHandler As SheetChangeHandler
Sub Auto_Open
Set MySheetHandler = New SheetChangeHandler
End Sub
Эта строка в Auto_Open (которая запускается при запуске) создаст экземпляр класса.