Advertisement
Guest User

Untitled

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