Advertisement
Guest User

Untitled

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