$RANDOM
${variable:position:length}
array_name=(value0 value1 value2 value3)
declare -a array_name
array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
valuen=${array_name[n]}
length=${#array_name[@]}
unset array[1] # 删除数组中第一个元素 unset array # 删除整个数组
read -n 1 -t 2
width=70
height=10
interval=1
while getopts w:h:i: ARG
do
case $ARG in
w)
width=$OPTARG
;;
h)
height=$OPTARG
;;
i)
interval=$OPTARG
;;
*)
echo "Unkown options"
exit 1
esac
done
shift $(($OPTIND-1))
for (( i=0;i<$width;i++ ))
do
blank_line="$blank_line "
done
for ((i=0;i<$height;i++))
do
lines[$i]=$blank_line # 全局变量
done
function generate_random_char()
{
full_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
char_position=$(($RANDOM%62))
char=${full_chars:$char_position:1}
echo $char
}
function insert_random_char_into_line()
{
local line=$1
local position=$2
local char=$3
prefix_line=${line:0:$position}
suffix_line=${line:$(($position+1))}
echo "$prefix_line$char$suffix_line"
}
function generate_new_line()
{
char=$(generate_random_char)
position=$(($RANDOM%$width))
new_line=$(insert_random_char_into_line "$blank_line" $position $char)
echo "$new_line"
}
function refresh_ui()
{
clear
for ((i=0;i<$height;i++))
do
echo "${lines[$i]}"
done
}
function get_input()
{
local input
read -n 1 -t 0.1 input
echo $input
}
function remove_input_char()
{
local char=$1
for((i=0;i<$height;i++))
do
line=${lines[$i]}
line=$(echo "$line"|sed -e "s/$char/ /g")
lines[$i]=$line
done
}
function screen_down()
{
for ((i=$(($height-1));i>0;i--))
do
lines[$i]=${lines[$(($i-1))]}
done
lines[0]=$(generate_new_line)
refresh_ui
}
refresh_ui
while :
do
old_date=$(date +"%s")
input=$(get_input)
if [ "$input" != "" ];then
remove_input_char $input
refresh_ui
fi
new_date=$(date +"%s")
if [ $(($new_date-$old_date)) -ge $interval ];then
screen_down
fi
done
- 读取数组元素的语法是${array[0]}而不能写成$array[0]
- 字符串变量作为参数时,请一定记得放在”“里面,否则前面的空格会丢失