Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #set -x
- Max_RAND=32762 #Максимальное целочисленное, возможное для bash.
- #А массив используем "на вырост"
- #TODO: обязательно проверку наличия файлов
- #TODO: поправить usage
- FILES=("/store1/library/rel/bible" "/store1/library/rel/koran")
- getFromRange(){
- #Мой первый авторский велосипед (которым очень доволен ^_^).
- #Выборка псевдослучайного integer из заданного диапазона.
- #В свое время был лаконичнее реализован на java, где random
- #изначально является double [0-1], и все выглядело проще, вроде:
- #double.floor(random*range+min)
- #Здесь мы получаем double[0-1] искуственно.
- #Но не сам random, а лишь множитель для него. За счет чего "масштабируем"
- #доступную в bash случайность, попутно втискивая в пределы диапазона.
- #Прибавляем к минимуму, -- этим ограничиваем снизу; а сверху ограниченно
- #тем фактом, что множитель для $RANDOM у нас изначально отражает соотношение
- #между длинной диапазона и пределом $RANDOM:
- #их произведение никогда не преступит очерченного.
- #В данном скрипте, всилу его назначения, $MIN
- #пожизненно равен 0 и не удел, но пусть балдеет, олицетворяя законченость
- #идеи.
- MIN=$1
- MAX=$2
- RANGE=$(($MAX-$MIN))
- r=$(bc -l <<<"($RANGE/$Max_RAND)*$RANDOM+$MIN") #получили свое число
- #Округляем как умеем, на сегодняшний день V_v
- #Текстовыми функциями. Когда-нибудь поржу.
- x=$(echo $r|sed 's_^.*[\.]\(.\).*_\1_') #какова первая цифра после точки?
- r=$(echo $r|sed -e 's/[\.].*//') #В любом случае срезаем все вместе с точкой
- if [ $x -gt 4 ] ; then ((r++)) ; fi #но плюсуем в целую часть,
- #если первая дробная была больше 4
- echo $r #И такой странный возврат результата из функции -_-
- }
- usage(){
- color bold #Где-то сорока по натуре, люблю блеск.
- color red #Написал скриптик меняющий цвета терминала по короткому запросу.
- color invert #Надоело катать конструкции вида $(echo -en //330[01;33m)
- #Может стоило поставить PonyLinux?
- echo -e "А-А-А-ЛЕНЬ! \n$0 <-k|-b> [-n<количество строк>] [-s<номер стартовой строки>] $(color blue) ^_^\ "
- echo -e "$(color reset) -k или -b явно указывают Писание. \nЕсли '-n' и '-s' не указаны, первое принимает значение 50, а второе выбирается случайно. \nПример: $(color blue) \n$0 -s500 -n150 -k $(color reset)\nвыведет вырезку в 150 строк из Корана, начиная с 500-й. А $(color blue)\n$0 -b -n150$(color reset)\nвыведет 150 строк, начиная с любой случайной, из Библии.$(color blue) \n$0 -b $(color reset) \nвыведет отрывок из Библии, 50 строк, начиная со случайной.\nПросто \n$0 выведет что Бог пошлет"
- }
- while getopts kbn:s: Option
- do
- case "$Option" in
- "b") FILE="${FILES[0]}" ;;
- "k") FILE="${FILES[1]}" ;;
- "n") My_COUNT="$OPTARG" ;;
- "s") My_NUM="$OPTARG" ;;
- * ) usage; exit 1 ;;
- esac; if [ ! $? -eq 0 ]; then usage; fi
- done
- #Если не выбран FILE, бросаем жребий
- if [ -z $FILE ]; then
- #Нумерация ячеек массивов начинается с ноля,
- #А отсчет длинны начинается с единицы.
- #Да и наша функция getFromRange возвращает
- #как минимум единицу, ибо не умеет в дроби, поэтому
- #здесь задаем минимум в единицу, максимум в
- #количество элементов,
- #но передавая полученное как индекс, минусуем его
- z=$(getFromRange 1 ${#FILES[@]})
- FILE=${FILES[((--z))]}
- fi
- LENGHT=$(grep "" $FILE -c)
- My_MIN=0
- My_MAX=$LENGHT
- #Если не задан -n, выбираем его случайно,
- #в человеколюбивых пределах
- if [ ! "$My_COUNT" ]; then My_COUNT=$(getFromRange 5 350); fi
- #Если не задан -s, испрашиваем Господа.
- if [ -z "$My_NUM" ]; then My_NUM=$(getFromRange "$My_MIN" "$LENGHT"); fi
- #Отсель.........
- color red; color invert; echo "CHOOSEN FILE=$FILE"; color reset
- color blue; echo -e "CHOOSEN START STRING=$My_NUM \nCHOOSEN LENGTH=$My_COUNT"; color reset \
- #............... досель
- #можно закомментировать, если не нужна статистика
- #по Божьей воле.
- sed -n ''"$My_NUM,+$My_COUNT {
- =
- p
- }"'' "$FILE" |less
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement