生成大型的隨機序列

上一頁 | 首頁

#!/bin/bash

# 腳本名:random_series.bash
# 作者:石仔
# 創建日期:2010年7月9日
# 版本:0.1.A
# 平台:跨平台
# 功能:創建一個包含隨機英文字母、阿拉伯數字的文件。該文件的大小由用戶指定,
#       必須是整數,單位為KB。每行64個字符,其中最後一個字符是換行符。

# set -x    # 若要調試本腳本,則可刪除此行行首的'#'。
# set -n    # 若要檢查本腳本的語法,則可刪除此行行首的'#',但檢查完之後務必
#             要將其重新加上。否則,只會檢查腳本的語法,而不會運行腳本。


###########################################################################
#                                   定義變量
###########################################################################

typeset -i file_size=$1         # 文件大小
typeset -i random=0             # 隨機數

# 用于創建隨機序列的字符列表
keys=(0 1 2 3 4 5 6 7 8 9
      a b c d e f g h i j k l m n o p q r s t u v w x y z
      A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
typeset -i n=${#keys[@]}        # 數組keys的大小

this_script=$(basename $0)      # 此腳本的文件名
output_file="random_series"     # 用于保存隨機字符序列的文件


###########################################################################
#                                   定義函數
###########################################################################

# 顯示腳本的用法
usage()
{
    echo "用法:$this_script <用于保存隨機字符串的文件的大小>"
    echo "文件大小的單位為KB,必須為整數"
}

# 生成一行包含63個英文字母、阿拉伯數字及1個換行符的隨機字符序列
make_random_line()
{
    local -i i=0
    local line
    while ((i < 63))
    do
        line="${line}${keys[$((RANDOM%n))]}"
        ((i++))
    done
    echo $line
}

# 根據給定的秒數生成一串用于表示時間的、可讀性較好的字符序列
readability_time()
{
    sec=$1
    if ((sec < 60))
    then
        echo "耗時:$sec秒。"
    elif ((sec < 3600))
    then
        echo "耗時:$((sec/60))分$((sec%60))秒。"
    else
        echo "耗時:$((sec/3600))時$(((sec%3600)/60))分$((sec%3600%60))秒。"
    fi
}

###########################################################################
#                                   腳本主體
###########################################################################

if (($# != 1))
then
    usage
    exit 1
fi

case $file_size in
    [1-9]*) : ;;
    *) usage ;;
esac

if [ -e $output_file ]
then
    printf "隨機字符序列將保存到$output_file,但它已存在。是否要覆蓋?[Y/N]"
    while read answer
    do
        if [ $answer = "Y" -o $answer = "y" ]
        then
            rm -f $output_file
            break
        elif [ $answer = "N" -o $answer = "n" ]
        then
            exit 1
        fi
    done
fi

# 生成一個大小為4字節的整數
random=$(dd if=/dev/random count=1 2>/dev/null \
        | od -t u4 | awk '{print $2}' | head -n1)

# 根據random生成15位的隨機數種子
RANDOM=$((random%32767+1))

# 因為設定每行為64個字符,所以每KB佔用16行
total_lines=$((file_size*16))
i=0
echo "請耐心等待,運行時長取決于所要生成的文件的大小。"
printf "執行中"
SECONDS=0   # 將shell變量SECONDS重置為0,以便于計時
while ((i < total_lines))
do
    make_random_line >> $output_file
    (($((i%100)) == 0)) && printf "."
    ((i++))
done
printf "\n隨機字符序列已保存到文件$output_file中。\n"

total_seconds=$SECONDS
readability_time $total_seconds
if [ $total_seconds -eq 0 ]
then
   total_seconds=1
   speed=$((file_size/total_seconds))
   echo "文件創建速率:大于${speed}KB/S"
else
   speed=$((file_size/total_seconds))
   echo "文件創建速率:${speed}KB/S"
fi


版權 © 2024 石仔