Сравнение строк Bash не работает - PullRequest
3 голосов
/ 16 декабря 2011

У меня есть следующая функция Bash:

checkForUpdates() {
    checkLatest
    ret=$?
    if [ $ret != 0 ]; then
        return $ret
    fi
    count=0
    for i in $(ssh $__updateuser@$__updatehost "ls $__updatepath/*${latest}*"); do
        file="${i##$__updatepath}"
        echo "$file" >> $__debuglog
        if [ -f $__pkgpath/$file ]; then
            remoteHash=$(ssh $__updateuser@$__updatehost "md5sum -b < $__updatepath/${file}")
            localHash=$(md5sum -b < $__pkgpath/$file)
            echo "${remoteHash:0:32} = ${localHash:0:32}" >> $__debuglog
            if [ "${remoteHash:0:32}" != "${localHash:0:32}" ]; then
                files[$count]=$file
                count=$(($count + 1))
                echo "Hashes not matched, adding $i" >> $__debuglog
            fi
        else
            files[$count]=$file
            count=$(($count + 1))
            echo "$file missing" >> $__debuglog
        fi
    done

    # Verify that the files array isn't empty.
    if [ $count != 0 ]; then
        return 0
    else
        return 33
    fi
}

По некоторым причинам сравнение remoteHash / localHash всегда возвращает true.Я добавил эхо, чтобы я мог видеть значения хэшей, и они определенно отличаются, и я не могу понять, где я ошибаюсь.Я безуспешно пробовал разных операторов, и это сводит меня с ума!

1 Ответ

3 голосов
/ 19 декабря 2011

это не относится к вашему вопросу, но больше общих советов, первый и самый важный вы не должны анализировать вывод ls, вместо этого используйте find -print0, вот пример: http://mywiki.wooledge.org/BashFAQ/001

также рассмотрите возможность использования [[ вместо [, см .: http://mywiki.wooledge.org/BashFAQ/031

Теперь о вашем коде, эта часть:

checkLatest
ret=$?
if [ $ret != 0 ]; then
    return $ret
fi

можно записать просто как:

checkLatest || return

и вам не нужно хранить счетчик для индекса массива, если вы инициализируете var как пустой массив, такой как files=(), вы можете добавить к нему элементы с помощью files+=("$file"), вы можете получить счет с помощью "${#files[@]}"

...