You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:31:01