Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Проблемы с работой Random'а в bash-скрипте (ubuntu 12.04)  (Прочитано 3745 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Задача:
Добавлять в подпись к электронной почте (почтовая программа - Mozilla Thunderbird) после контактов случайную цитату, связанную с деятельностью организации.
Решение:
Организовал bash-скрипт с использованием команды cat  (для склейки разных кусочков в один файл) и функции RANDOM (для подстановки случайного числа) и засунул этот скрипт в крон.
Код рабочего скрипта (10.04):
#!/bin/bash
function path {
    PATH=/home/papka-s-failami/
    echo $PATH
}
function quote {
    N=$[($RANDOM % 38) +1]
    echo $N
}
cat $(path)nachalo-podpisi-1-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-1-sotrudnika.html
cat $(path)nachalo-podpisi-2-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-2-sotrudnika.html
cat $(path)nachalo-podpisi-3-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-3-sotrudnika.html

Проблема:

В Ubuntu 10.04 работало, как нужно. После перехода на 12.04 скрипт отказался работать и его пришлось переписывать, изрядно покопавшись на просторах интернета. Но, к сожалению, единственная версия, которая хоть как-то запустилась без сообщениях об ошибках, работает не правильно. Скрипт запускается, но вместо того, чтобы выбирать одну цитату из всех 37, он выбирает одну из только 4 первых.
 Код местами рабочего скрипта (12.04):
#!/bin/bash
path() { PATH=/home/papka-s-failami/; echo $PATH; }
quote() { grep -m1 -ao '[0-37]' /dev/urandom | sed s/0/10/ | head -n1; }
cat $(path)nachalo-podpisi-1-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-1-sotrudnika.html
cat $(path)nachalo-podpisi-2-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-2-sotrudnika.html
cat $(path)nachalo-podpisi-3-sotrudnika.html $(path)$(quote) $(path)end.html > $(path)podpis-3-sotrudnika.html

Заранее спасибо за помощь.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
L~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
L~$

PATH зачем?
Wars ~.o

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Просто чтобы по 10 раз одно и то же не прописывать.
В приниципе, можно без этой функции, но проблема с рандомом появилась не из-за неё. Проверял.

Оффлайн absent

  • Активист
  • *
  • Сообщений: 368
  • Ubuntu 16.04
    • Просмотр профиля
намек на то, что PATH трогать не надо.
ведь правда,
function path {
    PATH=/home/papka-s-failami/
    echo $PATH
}
...
cat $(path)nachalo-podpis....
зачем?  :o
так было бы не проще?
_path=/home/popka-s-failami/
...
cat ${_path}nachalo-podpis....
посмотрите также, что возвращает
grep -m1 -ao '[0-37]' /dev/urandom | sed s/0/10/ | head -n1

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
По поводу $PATH... Вывод пути к папке изменил. Спасибо

grep -m1 -ao '[0-37]' /dev/urandom | sed s/0/10/ | head -n1Возвращает числа от 1 до 10

При изменении "sed s/0/10/" на "sed s/0/37/" возвращает числа от 1 до 37, но при этом само значение "37" возвращается намного чаще. Собственно, из-за того, что непредсказуемости такому рандому мягко говоря не хватает, я эту тему и создал.

В новой убунте можно как-то по старинке произвольное число вернуть? У меня появляются сообщения о пунктуационных ошибках, а в Интернете я нахожу информацию только по тем вариантам, которые в 10.04 у меня и так работали.

Оффлайн absent

  • Активист
  • *
  • Сообщений: 368
  • Ubuntu 16.04
    • Просмотр профиля
ubuntu 13.04
произвольное число с 1 по 37
echo $((RANDOM%37+1))от версии это врядли зависит

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
ubuntu 13.04 зачем? уже давно века.
Wars ~.o

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
echo $((RANDOM%37+1))В терминале всё выводит правильно, а при запуске скрипта - везде только единицы (или число, которое после + ставлю)

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
brainiacus,
echo $[RANDOM % 37 +1]
Wars ~.o

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
brainiacus,
echo $[RANDOM % 37 +1]
В терминале произвольные числа выводит правильно, а в скрипте выводит строку "$[RANDOM % 37 +1]". Значений нет  ???

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
L~$ echo $[RANDOM % 37 +1]
20
L~$ echo $[RANDOM % 37 +1]
25
L~$ r=$[RANDOM % 37 +1]
L~$ echo "$r"
32
L~$ echo "$r"
32
L~$ r=$[RANDOM % 37 +1]
L~$ echo "$r"
23
L~$
ну и?
Wars ~.o

Оффлайн brainiacus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
В терминале работает и выражение с круглыми скобками, и с квадратными.
Вызвать с помощью этих же выражений произвольное число во время работы скрипта не получается, так как в одном случае возвращается единица, а в другом то, что следует после echo.

Проверил на реальной системе и на VirtualBox'е.

Оффлайн Freezeman

  • Активист
  • *
  • Сообщений: 637
  • Xubuntu 14.04.2 LTS :: SSD Kingston HyperX Fury
    • Просмотр профиля
У меня нормально такой скрипт работает.
#!/bin/bash
echo $[RANDOM % 37 +1]
exit 0

Оффлайн absent

  • Активист
  • *
  • Сообщений: 368
  • Ubuntu 16.04
    • Просмотр профиля
может я чего не понял, но это отрабатывает как и должно
#!/bin/bash

_path=/sefef/wefwef/wefwef/

function quote {
    echo $(($RANDOM%38+1))
}

echo ${_path}$(quote)
рандом никуда не девается

Оффлайн Freezeman

  • Активист
  • *
  • Сообщений: 637
  • Xubuntu 14.04.2 LTS :: SSD Kingston HyperX Fury
    • Просмотр профиля
Такой тоже
#!/bin/bash
function quote {
    N=$[($RANDOM % 38) +1]
    echo $N
}
echo "zzzzzzz $(quote) sssssssss"
echo "mmmmmmm $(quote) fffffffff"
echo "vvvvvvv $(quote) eeeeeeeee"
exit 0


`--> bash test.sh                                                                                                                                                                               [17:34:54]
zzzzzzz 19 sssssssss
mmmmmmm 33 fffffffff
vvvvvvv 2 eeeeeeeee

Пользователь решил продолжить мысль 26 Апреля 2013, 13:41:36:
С
quote() { grep -m1 -ao '[0-37]' /dev/urandom | sed s/0/10/ | head -n1; }я так числа больше 10 и не получил ))
похоже, что это из-за grep -m1 -ao '[0-37]' /dev/urandom -- там по одному символу, и нет никаких 37
« Последнее редактирование: 26 Апреля 2013, 13:41:36 от Freezeman »

 

Страница сгенерирована за 0.058 секунд. Запросов: 25.