LINUX.ORG.RU

Как сгенерировать на bash киррилическую рандомную строку?

 ,


1

4

Пробовал через cat и через tr (по этому гайду http://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-fr...), но результат нулевой.

Как именно киррилическую строку сгенерировать? Желательное еще и рандомной длины (от 20 до 100 например).

Вроде как в sed есть юникода поддержка, но не нашел я примера в гугле.

Покажи скрипт

at ★★
()
ret() {
    declare -n _ans=$1
    "${@:2}"
}
random() { # RANDOM can not exceed 32767, so don't use it with arguments that differ too much.
    _ans=$(( $1 + RANDOM % ($2 - $1) ))
}
alphabet='абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
result=
ret length random 20 100
for (( i = 0; i < length; ++i )); do
    ret index random 0 "$(( ${#alphabet} - 1 ))"
    result+=${alphabet:index:1}
done
printf '%s\n' "$result"
anonymous
()
Ответ на: комментарий от anonymous
random() {
    _ans=$(( $1 + RANDOM % ($2 - $1 + 1) ))
}

Self-fix.

anonymous
()
Ответ на: комментарий от Zabroid

Нет. GNU tr вообще в юникод не может.

anonymous
()
Ответ на: комментарий от anonymous

круто, видно что настоящий программист писал. но я рискну поделиться своим вариантом:

$ a=абвгдеёжзийклмнопрстуфхцчшщъыьэюя;for _ in {1..10};do b+=${a:RANDOM%31:1};done;echo $b;unset b
ыхшзълъоци

anonymous
()
Ответ на: комментарий от anonymous

RANDOM%31

Наркоман? Длина твоей строки — 33.

{1..10}

Неэффективно, но тут сойдёт.

unset b

Это надо делать в начале, а не в конце.

anonymous
()
Ответ на: комментарий от anonymous

Алсо, я немного ошибся: $((20+RANDOM%81)).

anonymous
()

cat /dev/urandom | grep -aoe [абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ] | tr -d '\n' | head -c $((($RANDOM%(2*20))/2*2)) && echo

anonymous
()
Ответ на: комментарий от Zabroid

Ну вот что я накостылял на случай генерации рандома из заданного диапазона

getFromRange(){
Max_RAND=32762          #Максимальное целочисленное, возможное для bash.
                        
        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         #И такой странный возврат результата из функции -_-

        }

Округлять правоверно еще не умею V_v

Csandriel
()
Ответ на: комментарий от Csandriel

Округление требуется по стольу, по скольку на выходе сырой функции - число с плавающей точкой (что необходимо для масштабирования рандома)

Csandriel
()
Ответ на: комментарий от Csandriel

И еще бы пробел вставить в рандомное место получившейся строки (кроме 1 и последнего символа) и вообще круто будет !

Zabroid
() автор топика
Ответ на: комментарий от Zabroid

Попробуй пробелы вокруг минуса поставить, чтоли. Странно, у меня все работает. Может как-то криво функцию из скрипта выдрал? Да не, скопипастил.

Csandriel
()
Ответ на: комментарий от Csandriel

Генерируй два слова рандомной длинны, паяй их через пробел.

Это будет выглядеть типа

result=$arg1' '$arg2

Csandriel
()
Ответ на: комментарий от Zabroid

Погоди, так это генерация рандомного числа

Внезапно. Ты же хотел слово рандомной длинны из диапазона? Кстати можешь наваять массив русских символов, и той же функцией дергать из массива буквы для своих слов. Случайное количество (размер счетчика дергалки задать случайно), случайные символы. Чего же более?

Csandriel
()
Ответ на: комментарий от Csandriel
$ strace -f bash csandriel.bash |& sed -rn 's/^\[pid *([0-9]+)\].*/\1/p' | sort -u | wc -l | { read x; echo $(( x ? x - 1 : 0 )); }
9

Девять форков нужно твоему говнокоду (включая один, нужный для получения результата, да). Вот этому (Как сгенерировать на bash киррилическую рандомную строку? (комментарий)) — 0.

anonymous
()
Ответ на: комментарий от anonymous

Честно говоря, не понял, что конкретно ты хотел этим сказать. Хотя догадываюсь, что хотел обидеть гуманитария. Не выйдет, я ведь не претендую на репутацию профессионального админа или полноценного кодера. Зато ты не знаешь ни одного аята Корана и ни одного стиха Библии, не имеешь понятия о нотной грамоте, ничего не шурупишь в пиротехнике, и не в состоянии ни построить дом своими руками, ни посадить дерево, азаза. ^_^

Csandriel
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.