生成大型的隨機序列
#!/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 石仔