Use a variável RANDOM
do seu shell para obter um número aleatório, mas semear o gerador de números aleatórios com a data de hoje primeiro (se o script não tiver sido usado desde a meia-noite). Em seguida, escolha essa linha fora do arquivo.
Em outras palavras (Bash abaixo) ...
wotd_data="wotd_data.txt"
stamp="$HOME/.wotd-stamp"
stamp_random="$HOME/.wotd-random"
date_now=$( date +"%Y%m%d" )
if [ -f "$stamp" ]; then
date_last=$( <"$stamp" )
else
date_last=0
fi
if [ "$date_last" != "$date_now" ]; then
RANDOM="$date_now"
echo "$date_now" >"$stamp"
else
RANDOM=$( <"$stamp_random" )
fi
number=$RANDOM
echo $number >"$stamp_random"
number=$RANDOM$RANDOM # See the "Edit #2" note below
data_length=$( wc -l <"$wotd_data" )
line=$(( 1 + ( number % data_length ) ))
sed -n "${line}p" "$wotd_data"
Isso usa um arquivo de registro de data e hora no $HOME
do usuário para acompanhar a última vez que o comando foi executado. Se não foi hoje, volte a semear $RANDOM
com a data de hoje e escreva a data de hoje no arquivo.
EDIT # 1: Eu também tive que armazenar o último número aleatório usado desde $RANDOM
é local para o shell atual. A semeadura não será transferida para a próxima invocação do script. Eu armazeno isso em um arquivo separado "selo aleatório". Você pode querer mudar isso para usar apenas um arquivo para a data da última chamada e o último número aleatório usado.
EDIT # 2: Alguém consegue identificar o problema com o meu código original? Bem, $RANDOM
nunca será maior que 32767 (16 bits), e o arquivo teria mais linhas do que isso. Isso significa que talvez usar $RANDOM
sozinho pode não ser uma boa ideia. É por isso que recorro a simplesmente concatenar $RANDOM
consigo mesmo, gerando um número aleatório mais longo. A semeadura e o arquivo "selo aleatório" não são afetados por isso.
EDIT # 3: Só notei que o OP pedia "a mesma linha toda vez que o roteiro é executado em um dia em particular" (em um comentário que meu cérebro não digitou tarde ontem à noite), que é exatamente o que meu script não faz (dá a mesma seqüência de linhas todos os dias). Estou deixando minha solução aqui de qualquer maneira, caso isso ajude alguém com problemas semelhantes de preservar o estado de $RANDOM
entre as chamadas de script.