Получение случайного числа 0…255 в bash
Понадобилось получить случайное число в шеле из устройства /dev/urandom, написал небольшую функцию, сохраню у себя, чтобы не потерялась.
getrand() {
head -c1 /dev/urandom | hexdump -d | sed -E '1!d;s/.+ +0+//'
}Ещё вариант придумался (но необходим openssl):
getrand() {
openssl rand 1 -hex | xargs -I. printf "%d" 0x.
}Бу: ООП в bash
ООП к «башу» приделать и до меня пытались, ничего в этом смысле нового, но мне ни одна реализация не нравится, из того, что я видел, всё примитивное и синтаксис кривой, всё время хотелось свою сделать. Вчера вечером заморочился, думал на выходных
Долго мучался с названием, решил, что пусть пока называется «Бу» (
#!/bin/bash
# Evgeny.Stepanischev Jan 2013 /
. b-oo.sh
@Class Base
@Dim cnt
@Dim
__construct() {
This[cnt]=0
}
@Dim
IncCnt() {
let 'This[cnt]++'
}
@Dim
GetCnt() {
[ "$This[cnt]" -gt 1 ] && s=s
echo $Self said $This[cnt] time$s
}
@End
@Class Dog Base
@Dim
say() {
$This.IncCnt
echo 'Bow-wow!'
}
@End
@Class Car Base
@Dim
say() {
$This.IncCnt
echo 'Beep'
}
@End
@Class Proxy
@Dim obj
@Dim Static
getInstance() {
$1.New Self[obj]
@Ret $2 $Self[obj]
}
@End
Proxy.getInstance Car car # создание через «фабрику», через статический метод
Proxy.getInstance Dog dog # создание через «фабрику», через статический метод
$car.say
$car.say
$car.GetCnt # 2, вызывается из родительского класса
$dog.say
$dog.GetCnt # 1, вызывается из родительского класса
Dog.New anothedog # создание через конструктор
$anothedog.say
$anothedog.say
$anothedog.GetCnt # 2, вызывается из родительского классаЯ не стал заморачиваться с модификаторами доступа (хотя может ещё и сделаю), из реализованного: создание объектов, наследование (есть множественное), статические и динамические методы и свойства, конструктор, есть переменная This (текущий объект), Self (текущий класс) и Parent (чтобы вызывать родительские методы).
Всё делается при помощи вызовов, начинающихся с собачки. Вряд ли синтаксис
# !неправильно
obj=$(Dog.New)
obj=`Dog.New`Чтобы выполнить Dog.New интерпретатор создаёт отдельный процесс, где всё и выполняется, после выхода из этого процесса всё моё колдунство исчезает и от переданного значения толку нет (если у вас не «баш 4», тогда есть способы).
Поэтому конструктор у меня принимает первым параметром имя переменной, куда нужно положить экземпляр класса, а облегчения жизни программисту сделана специальная команда «@Ret», посмотрите как она используется в методе getInstance.
Естественно, в глобальном пространстве создаётся куча всякой магии, но у всего этого есть свои префиксы.