Advertisement
shinemic

blink.sh

May 28th, 2024
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.08 KB | None | 0 0
  1. #!/usr/bin/bash
  2.  
  3. # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
  4. #     脚本名称: blink.sh                                                       #
  5. #     脚本用途: 打字机输出仿真                                                 #
  6. #     开发作者: 木哥                                                           #
  7. #     当前版本: 1.0                                                            #
  8. #     更新日志:   <版本号>  |      <更新时间>     | <更新内容>                 #
  9. #                   1.0     | 2023-06-05 23:00:00 | 脚本初始化                 #
  10. # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
  11.  
  12. SCALES=2000
  13. DELAY_SLEEP=200  # 光标闪烁的时间间隔
  14. DELAY_START=1000 # 输入前等待时间
  15. DELAY_END=2000   # 输入完毕后等待时间
  16.  
  17. # 打字间隔最高时间随机取值
  18. DELAY_TYPES=(2 2 3 3 5 5 5 8 8 8 8 10 10 10 10 10 10 20 20 20)
  19.  
  20. # 控制并发命名管道
  21. lock_fifo="/tmp/blink_$$.lock.fifo"
  22. mkdir -p $(dirname "$lock_fifo")
  23. mkfifo $lock_fifo
  24. exec 10<>$lock_fifo
  25. echo >&10
  26.  
  27. # ------------------------------------------------------- #
  28.  
  29. sleep_interval() {
  30.     sleep $(echo "$1/$SCALES" | bc -l)
  31. }
  32.  
  33. interrupt() {
  34.     clean
  35.     exit 1
  36. }
  37.  
  38. clean() {
  39.     tput cnorm # 恢复光标
  40.     exec &>>/dev/null
  41.     kill $pid_cursor
  42.     kill $pid_type
  43.     rm $lock_fifo
  44. }
  45.  
  46. # ------------------------------------------------------- #
  47.  
  48. trap interrupt SIGINT SIGHUP
  49.  
  50. tput civis # 隐藏光标
  51.  
  52. # 光标闪烁进程
  53. {
  54.     while :; do
  55.         # 光标闪烁 - 下划线
  56.         sleep_interval $DELAY_SLEEP
  57.         read -u 10
  58.         {
  59.             if [ "$s" = "e" ]; then
  60.                 break
  61.             fi
  62.             echo -n "█"
  63.             echo 1 >&10
  64.         }
  65.  
  66.         # 光标闪烁 - 空置
  67.         sleep_interval $DELAY_SLEEP
  68.         read -u 10 s
  69.         {
  70.             [ "$s" = 1 ] && echo -ne "\b"
  71.             if [ "$s" = "e" ]; then
  72.                 break
  73.             fi
  74.             echo -ne " \b"
  75.             echo 0 >&10
  76.         }
  77.     done
  78. } 2>/dev/null &
  79. pid_cursor=$!
  80.  
  81. # 稍作停顿
  82. sleep_interval $DELAY_START
  83.  
  84. # 打字进程
  85. {
  86.     while IFS= read -r line; do
  87.         # 空行
  88.         if ((${#line} == 0)); then
  89.             read -u 10
  90.             {
  91.                 echo
  92.                 echo 2 >&10
  93.             }
  94.         fi
  95.  
  96.         # 遍历每个字符
  97.         for ((i = 0; i < ${#line}; i++)); do
  98.             cur_char=${line:$i:1}
  99.             if [[ ! "$cur_char" =~ ^[[:space:]]*$ ]]; then
  100.                 delay_type_select=${DELAY_TYPES[ $((RANDOM % ${#DELAY_TYPES[@]})) ]}
  101.                 sleep_interval $((RANDOM % delay_type_select))
  102.             fi
  103.             read -u 10 s
  104.             {
  105.                 [ "$s" = 1 ] && echo -ne "\b"
  106.                 echo -n "${line:$i:1}"
  107.                 # 如输出至一行中最后一个字符,直接输出"\n"
  108.                 ((i == ${#line} - 1)) && echo
  109.                 echo 2 >&10
  110.             }
  111.         done
  112.  
  113.     done
  114.  
  115. } 2>/dev/null
  116. pid_type=$!
  117.  
  118. clean
  119. exit 0
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement