如何在Bash Shell中实现可自动下移的对象?
命令行实现对象下移的方案
要在命令行里让对象每秒下移一行,核心思路就是每次清屏后在新位置输出对象,配合延时控制节奏。下面用bash脚本给你具体实现步骤:
基础版实现
先从最简单的逻辑入手,用空行占位来控制对象位置:
#!/bin/bash # 起始行号,从第一行开始 current_line=1 # 获取终端总行数,判断对象何时移出屏幕 terminal_lines=$(tput lines) while true; do # 清屏,避免残留旧位置的对象 clear # 输出空行到当前行的上一行,把对象推到目标行 for ((i=1; i<current_line; i++)); do echo "" done # 输出你的"侵略者"对象,这里用👾举例 echo "👾" # 行号+1,准备下一次下移 ((current_line++)) # 当行号超过终端行数,说明对象已经移出屏幕,停止循环 if ((current_line > terminal_lines)); then break # 如果想让对象循环出现,把break换成 current_line=1 即可 fi # 延时1秒,保证每秒移动一行 sleep 1 done
高效优化版
上面的循环输出空行效率不高,用tput cup命令可以直接定位光标位置,更适合后续扩展多对象:
#!/bin/bash current_line=1 terminal_lines=$(tput lines) # 获取终端列数,让对象居中显示(可选) terminal_cols=$(tput cols) # 自定义你的对象字符 object="👾" # 计算居中的列位置 col=$(( (terminal_cols - ${#object}) / 2 )) while true; do clear # 直接把光标移到目标行和列的位置 tput cup $current_line $col # -n 参数避免自动换行,保证对象位置准确 echo -n "$object" ((current_line++)) if ((current_line > terminal_lines)); then break fi sleep 1 done
关键细节说明
tput lines/tput cols:自动获取终端的行/列数,适配不同大小的终端窗口sleep 1:严格控制每秒移动一次,符合你的速率要求clear:每次循环清屏是为了让视觉上呈现"移动"效果,而不是不断叠加输出- 如果后续要加用户交互(比如发射子弹),可以用
read -t 0.1 -n 1 key实现非阻塞读取输入,避免阻塞移动逻辑
内容的提问来源于stack exchange,提问作者Tundra
相关产品推荐
相关产品推荐

