Csandriel

hword

Jan 2nd, 2019 (edited)
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.87 KB | None | 0 0
  1. #! /bin/bash
  2. #csandriel
  3. #~2017
  4.     Max_RAND=32762          #Максимальное целочисленное, возможное для bash.
  5.                             #А массив используем "на вырост"
  6.     #TODO: обязательно проверку наличия файлов
  7.     #TODO: поправить usage
  8.     FILES=("/data0/library/rel/bible" "/data0/library/rel/guran")
  9.     getFromRange(){
  10.      
  11.                             #Мой первый авторский велосипед (которым очень доволен ^_^).
  12.                             #Выборка псевдослучайного integer из заданного диапазона.
  13.                             #В свое время был лаконичнее реализован на java, где random
  14.                             #изначально является double [0-1], и все выглядело проще, вроде:
  15.                             #double.floor(random*range+min)
  16.                             #Здесь мы получаем double[0-1] искуственно.
  17.                             #Но не сам random, а лишь множитель для него. За счет чего "масштабируем"
  18.                             #доступную в bash случайность, попутно втискивая в пределы диапазона.
  19.                             #Прибавляем к минимуму, -- этим ограничиваем снизу; а сверху ограниченно
  20.                             #тем фактом, что множитель для $RANDOM у нас изначально отражает соотношение
  21.                             #между длинной диапазона и пределом $RANDOM:
  22.                             #их произведение никогда не преступит очерченного.
  23.                             #В данном скрипте, всилу его назначения, $MIN
  24.                             #пожизненно равен 0 и не удел, но пусть балдеет, олицетворяя законченость
  25.                             #идеи.
  26.             MIN=$1
  27.             MAX=$2
  28.             RANGE=$(($MAX-$MIN))
  29.             r=$(bc -l <<<"($RANGE/$Max_RAND)*$RANDOM+$MIN") #получили свое число
  30.                             #Округляем как умеем, на сегодняшний день V_v
  31.                             #Текстовыми функциями. Когда-нибудь поржу.
  32.             x=$(echo $r|sed 's_^.*[\.]\(.\).*_\1_') #какова первая цифра после точки?
  33.             r=$(echo $r|sed -e 's/[\.].*//')        #В любом случае срезаем все вместе с точкой
  34.             if  [ $x -gt 4 ] ; then  ((r++)) ; fi   #но плюсуем в целую часть,
  35.                                                     #если первая дробная была больше 4
  36.             echo $r         #И такой странный возврат результата из функции -_-
  37.            
  38.             }
  39.      
  40.     usage(){
  41.     color bold              #Где-то сорока по натуре, люблю блеск.
  42.     color red               #Написал скриптик меняющий цвета терминала по короткому запросу.
  43.     color invert            #Надоело катать конструкции вида $(echo -en //330[01;33m)
  44.                             #Может стоило поставить PonyLinux?
  45.     echo -e "А-А-А-ЛЕНЬ! \n$0 <-k|-b> [-n<количество строк>] [-s<номер стартовой строки>]  $(color blue) ^_^\ "
  46.      
  47.     echo -e "-k или -b явно указывают Писание. \nЕсли '-n' и '-s' не указаны, первое принимает значение 50, а второе выбирается случайно. \nПример: \n$0 -s500 -n150 -k \nвыведет вырезку в 150 строк из Корана, начиная с 500-й. А \n$0 -b  -n150\nвыведет 150 строк, начиная с любой случайной, из Библии.\n$0 -b \nвыведет отрывок из Библии, 50 строк, начиная со случайной.\nПросто \n$0 выведет что Бог пошлет"
  48.     }
  49.             while getopts kbn:s: Option
  50.             do
  51.             case "$Option" in              
  52.                     "b") FILE="${FILES[0]}" ;;
  53.                     "k") FILE="${FILES[1]}" ;;
  54.                     "n") My_COUNT="$OPTARG" ;;
  55.                     "s") My_NUM="$OPTARG" ;;
  56.                     * ) usage; exit 1 ;;
  57.             esac; if [ ! $? -eq 0 ]; then usage; fi
  58.             done
  59.                             #Если не выбран FILE, бросаем жребий
  60.             if [ -z $FILE ]; then
  61.                             #Нумерация ячеек массивов начинается с ноля,
  62.                             #А отсчет длинны начинается с единицы.
  63.                             #Да и наша функция getFromRange возвращает
  64.                             #как минимум единицу, ибо не умеет в дроби, поэтому
  65.                             #здесь задаем минимум в единицу,  максимум в
  66.                             #количество элементов,
  67.                             #но передавая полученное как индекс, минусуем его
  68.             z=$(getFromRange 1 ${#FILES[@]})
  69.             FILE=${FILES[((--z))]}
  70.                             fi
  71.      
  72.     LENGHT=$(grep "" $FILE -c)
  73.     My_MIN=1
  74.     My_MAX=$LENGHT
  75.      
  76.                             #Если не задан -n, выбираем его случайно,
  77.                             #в человеколюбивых пределах
  78.     if [ ! "$My_COUNT" ]; then  My_COUNT=$(getFromRange 5 350); fi
  79.                             #Если не задан -s, испрашиваем Господа.
  80.     if [ -z "$My_NUM" ]; then My_NUM=$(getFromRange "$My_MIN" "$LENGHT"); fi
  81.      
  82.                             #Отсель.........
  83. echo "CHOOSEN FILE=$FILE";
  84. echo -e "CHOOSEN START STRING=$My_NUM \nCHOOSEN LENGTH=$My_COUNT";
  85.                             #............... досель
  86.                             #можно закомментировать, если не нужна статистика
  87.                             #по Божьей воле.
  88.      
  89.     sed -n ''"$My_NUM,+$My_COUNT    {
  90.                                    =
  91.                                    p
  92.                                    }"'' "$FILE" |less
Add Comment
Please, Sign In to add comment