脚本,实现功能:例如一个小组有八个人,需要随机选取n个人。用户执行该脚本,并且用参数传递进去数值,作为需要选取的人数,输出结果,然后输出结果:

  1. #!/bin/bash 
  2. #Author:  
  3. #Date & Time: 2010-12-24-20:42:42 
  4. #Description:  
  5. #Version : 1.0.1 
  6. //定义错误输出函数
  7. usag () { 
  8.    echo -e "Wrong Option or Wrong Value . \033[31m USAG:\033[0m`basename $0` [-n num] ;And number range:0<num<8" 
  9.    exit 1 
  10.         } 
  11.     let NUM=1 //如果用户不传递参数,就默认为是随机一个人
  12. //读取判断用户输入的参数值
  13.     while getopts ":n:" SWITCH ; do 
  14.         case $SWITCH in 
  15.          n) 
  16.            [ $OPTARG -gt 8 -o $OPTARG -lt 1 ] && usag 
  17.            NUM=$OPTARG 
  18.            ;; 
  19.          \?) 
  20.             usag 
  21.          ;; 
  22.         esac
  23.      done 
  24.  
  25. arr=(guokeqin weiwei niuyue sunhaoyuan zhaoyupo liuxingya gaohuina liyuchao) 
  26.  
  27. if [ $NUM -eq 1 ];then 
  28.   INDEX=$[$RANDOM%8] 
  29.   echo "${arr[$INDEX]}" 
  30. else 
  31.   // ${#arr[*]} 特殊用法,返回arr[]数组内非空值的个数.
  32.  until [ ${#indexarr[*]} -eq $NUM ] ; do 
  33.      tmp=$[$RANDOM%8] 
  34.      echo "${index[*]}"| grep "$tmp" || indexarr[${tmp}]=$tmp
  35. //上面也可不进行判断直接进行赋值,如果没有重复则赋值后数组非空值值个数增1,如果重复则覆盖,非空值个数不变
  36.    done 
  37.   //开始顺序输出数组中非空值部分对应的数组值.
  38.    for I in $(seq 1 8 );do 
  39.     let I-- 
  40.     [ ${indexarr[$I]} -eq $I ] &>/dev/null && echo "${arr[${indexarr[$I]}]}" 
  41.    done 
  42. fi 
  43.  


 测试结果:

知识:

1. 数组用法例:

集体赋值:ARRAY=(1 2 3 4 5 6 )
单个赋值:ARRAY[3]=6
显示单个数组值: echo ${ARRAY[3]

显示数组中所有非空值:echo ${ARRAY[*]}

显示数组中所有非空值个数:echo ${#ARRAY[*]}

 

2. 变量RANDOM

系统自带的随机数变量

其由系统随机生成16位id二进制数。需要指定范围时进行取模。