Калькулятор в консоли

Для питонщика-линуксоида, подумал я однажды, использовать гуёвый калькулятор ради нескольких арифметических действий — не комильфо. Тогда полчаса скриптования привели вот к такой конструкции в .bashrc

=() {
    if calc=`python3 -c "from math import *; print(${@//x/*})" 2>/dev/null`
    then
        echo $calc
    else
        echo Error >&2
    fi
}

И voilà, вся мощь пайтона на кончиках пальцев! 🙂

$ = 9 / 98
0.09183673469387756
$ = pi
3.141592653589793
$ = 'sin(2 x pi)'
-2.4492935982947064e-16
$ = 2 xx 64
18446744073709551616
$ = 2 xx 32
4294967296

Жаль, только, что шелл трактует на свой лад скобки и звёздочки. Вопрос со звёздочками решился конструкцией ${@//x/*} (вместо них для умножения теперь используется икс), а вот выражения со скобками приходится брать в кавычки.

Заморочку с ветвлением добавил для того, чтобы в случае ошибки не вываливать весь вывод питоновского трассировщика, а показать скромное error.

Валидация ИНН

Для собственных нужд понадобилось соорудить на Python функцию для проверки корректности ИНН. Собственно, вот результат. Работает и со второй, и с третьей версиями Python.

def is_valid_inn(inn):
    '''функция проверяет корректность ИНН
    (длина, набор символов, контрольная сумма)
    :param inn: строка с ИНН (10 или 12 символов)
    :type inn: str or unicode
    :returns: True если ИНН корректный
    :rtype: bool
    '''
    multiplier = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
    try:
        inn = [int(i) for i in inn]
    except ValueError:
        return False
 
    def checksum(digit):
        _inn = [0] * (12 - digit) + inn
        s = sum([multiplier[i] * _inn[i] for i in range(11)])
        return _inn[11] == s % 11 % 10
 
    if len(inn) == 12:
        return checksum(11) and checksum(12)
    elif len(inn) == 10:
        return checksum(10)
    return False

INI-файлы для бедных

Чтение INI-файлов для бедных. Немного bash и крупица sed. Отлично подойдёт для конфигов на десяток параметров. Если параметр встречается в конфиге несколько раз, используется только последнее значение.

Умеет

  • игнорировать комментарии (всё, что после октото́рпа и точки с запятой),
  • длинные значения, в том числе с пробелами (будьте аккуратнее с пробелами в шелле, не забывайте экранировать),
  • игнорировать незнакомые имена и ошибки синтаксиса.

Не умеет

  • различать секции,
  • указывать на незнакомые имена,
  • следить за синтаксисом.
while read I ; do
    I=`(echo $I | sed "s/[#;\[].\+$//; s/^ \+//; s/ \+$//;
                       /^ \+$/d; /[^=]\+=[^=]\+/!d; s/\s\+=\s\+/=/")`
    case `echo $I | cut -d= -f1` in
        'some_value')
            SOME=`echo $I | cut -d= -f2` ;;
        'another_value')
            ANOTHER=`echo $I | cut -d= -f2` ;;
        'yet_another_value')
            YET_ANOTHER=`echo $I | cut -d= -f2` ;;
	esac
done < /path/to/file.ini