Bir komut dosyasının her seferinde rastgele bir komut çalıştırmasını sağlayın


1

Cron ile günlük olarak çalıştırmayı planladığım bir senaryom var. Bununla birlikte, betiğin belirli bir bölümünün belirli bir günde çalıştırma olasılığı olan yalnızca rasgele olarak çalışmasını istiyorum.

İşte benim temel fikrim.

$ RANDOM kullanın ve tek bir rasgele rakam elde etmek için kesin:

echo $RANDOM | cut -c1

Bu basamağı değerlendirmek için if / then testini kullanın ve yalnızca belirli bir değerle eşleştiğinde uygulayın:

if [(echo $RANDOM | cut -c1) = 3]; then
echo "YES" >> ~/result.txt
fi

Ancak, bu çalışmıyor. Komut dosyası aşağıdakilerle başarısız olur:

./testscript: line 3: syntax error near unexpected token `echo'
./testscript: line 3: `if [(echo $RANDOM | cut -c1) = 3]; then'

Bence fikir sağlam, fakat sözdizimi yanlış anladığımı tahmin ediyorum.

Herhangi bir fikir?

Mac OSX 10.7.2’de bash kullanımı

Muhtemelen ilginç kurgu: koştum echo $RANDOM | cut -c1 100.000 kez ve sonra her basamağın görünme sıklığını hesapladım, bu yüzden betiği çalıştıracağı frekansı uygun değerleri seçerek ayarlayabilirim. İlginç bir şekilde ilk bakışta rakamların dağılımı Benford Yasasına uyuyor gibi görünüyor ...

Yanıtlar:


1

kullanım

if [ "$(echo $RANDOM | cut -c1)" = 3 ]; then
    echo "YES" >> ~/result.txt
fi

ya da

[ "${RANDOM:0:1}" = 3 ] && echo "YES" >> ~/result.txt

Bu da işe yarıyor! Başka yollarla nasıl yapıldığını gösterdiğiniz için teşekkür ederiz. Sağladığım cevap olarak bunu seçtim, çünkü cevap vermeye çalıştığım şekli düzeltildi, ancak verilen cevap da işe yarıyor.
Themistocles

3

$ RANDOM'un verilen bir sayıdan daha küçük olup olmadığını test etmek daha iyidir. 10000'ü seçtiyseniz,

if [ $RANDOM -le 10000 ]; then
    echo "YES" >> ~/result.txt 
fi 

Hile yapacak. Elbette farklı bir numara seçebilirsiniz. ("-le", eşit veya daha küçük anlamına gelir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.