1#! /bin/bash 2# bashrand - generate a random number in a specified range with an 3# optionally specified ``seed'' value. 4# 5# Original Author: Peter Turnbull, May 1993 6 7usage() 8{ 9 echo "$PROG: usage: $PROG [-s seed] lower-limit upper-limit" >&2 10} 11 12PROG=${0##*/} 13 14SEED=$$ # Initialize random-number seed value with PID 15 16while getopts s: opt 17do 18 case "$opt" in 19 s) SEED=$OPTARG ;; 20 *) usage ; exit 2 ;; 21 esac 22done 23 24shift $((OPTIND - 1)) 25 26# Process command-line arguments: 27case $# in 28 2) Lower=$1; Upper=$2 ;; 29 *) usage ; exit 2 ;; 30esac 31 32# Check that specified values are integers: 33expr "$Lower" + 0 >/dev/null 2>&1 || { 34 echo "$PROG: lower ($Lower) not an integer" >&2 35 exit 1 36} 37 38expr "$Upper" + 0 >/dev/null 2>&1 || { 39 echo "$PROG: upper ($Upper) not an integer" >&2 40 exit 1 41} 42 43expr "$SEED" + 0 >/dev/null 2>&1 || { 44 echo "$PROG: seed ($SEED) not an integer" >&2 45 exit 1 46} 47 48# Check that values are in the correct range: 49(( $Lower < 0 )) || [ `expr "$Lower" : '.*'` -gt 5 ] && { 50 echo "$PROG: Lower limit ($Lower) out of range" >&2 51 exit 1 52} 53 54(( $Upper > 32767 )) || [ `expr "$Upper" : '.*'` -gt 5 ] && { 55 echo "$PROG: Upper limit ($Upper) out of range" >&2; 56 exit 1 57} 58 59(( $SEED < 0 )) || (( $SEED > 32767 )) || [ `expr "$SEED" : '.*'` -gt 5 ] && { 60 echo "$PROG: Seed value ($SEED) out of range (0 to 32767)" >&2 61 exit 1 62} 63 64(( $Upper <= $Lower )) && { 65 echo "$PROG: upper ($Upper) <= lower value ($Lower)" >&2 66 exit 1 67} 68 69# Seed the random-number generator: 70RANDOM=$SEED 71 72# Compute value, scaled within range: 73let rand="$RANDOM % ($Upper - $Lower + 1) + $Lower" 74 75# Report result: 76echo $rand 77