Linux echo 命令 5 个高级转义符实战: 退格、 回车的 3 种脚本应用
Linux echo命令高级转义符实战:退格、回车的3种脚本应用
1. 转义符速查与核心原理
在Linux终端交互和脚本编写中,echo -e的转义字符能实现光标控制、文本特效等高级功能。以下是5个关键转义符的速查表:
| 转义符 | 作用描述 | ASCII码 | 典型应用场景 |
|---|---|---|---|
\b | 退格(删除前一个字符) | 08 | 密码输入掩码、动态修正 |
\r | 回车(光标回到行首) | 0D | 进度条、单行刷新 |
\c | 终止输出(忽略后续字符) | - | 交互式问答控制 |
\n | 换行(光标移到下一行首) | 0A | 多行文本输出 |
\t | 水平制表符 | 09 | 对齐表格数据 |
工作原理:当启用-e选项时,echo会解析字符串中的反斜杠序列。例如\b实际发送ASCII码08到终端,终端收到后会执行退格操作。需要注意的是:
- 转义效果依赖终端模拟器的实现
- 部分老旧设备可能不支持所有转义序列
- 在管道传递时需确保下游程序能处理控制字符
2. 进度条动态实现技巧
2.1 基础进度条脚本
#!/bin/bash echo -ne "[ ]\b\b\b\b\b" for i in {1..20}; do echo -n "#" sleep 0.1 done echo "] Done!"关键点解析:
-n取消末尾换行\b连续五次回退到方括号内- 循环输出
#形成进度填充
2.2 百分比进度显示
for i in {1..100}; do printf "\rProgress: %3d%%" $i sleep 0.05 done echo提示:
printf比echo更适合格式化输出,%3d保证数字始终占3位宽度
2.3 彩色进度条增强版
echo -e "[\E[34m=====\E[0m]" for i in {1..5}; do echo -ne "\r[\E[34m" for j in $(seq 1 $i); do echo -n "="; done echo -ne "\E[0m" sleep 0.5 done颜色控制语法:
\E[34m:设置蓝色(34为颜色码)\E[0m:重置颜色属性- 可组合使用如
\E[34;1m表示亮蓝色
3. 密码输入模拟与文本覆盖
3.1 密码输入掩码效果
echo -n "Enter password: " while IFS= read -r -s -n1 char; do if [[ $char == $'\0' ]]; then break fi password+="$char" echo -n "*" done echo echo "Password length: ${#password}"参数说明:
-s:禁止回显-n1:每次读取1字符$'\0':检测回车键(ASCII NUL)
3.2 动态文本覆盖技术
for i in {10..1}; do echo -ne "\rCountdown: $i " sleep 1 done echo -e "\rLaunch! "3.3 多行文本局部刷新
echo -e "Line1\nLine2\nLine3" sleep 1 echo -ne "\033[2A\r" # 上移2行 echo "New Line1"光标控制序列:
\033[2A:光标上移2行\033[K:清除从光标到行尾的内容\033[s/\033[u:保存/恢复光标位置
4. 高级组合应用案例
4.1 终端打字机效果
text="Hello, this is typewriter effect" for ((i=0; i<${#text}; i++)); do echo -n "${text:$i:1}" sleep 0.1 if (( (i+1) % 5 == 0 )); then echo -n "\b\b\b \b\b\b" sleep 0.3 fi done echo4.2 旋转等待指示器
spin='-\|/' while :; do for i in {0..3}; do echo -ne "\rProcessing ${spin:$i:1}" sleep 0.1 done done4.3 控制台贪吃蛇游戏框架
#!/bin/bash width=20 height=10 snake="*" food="@" # 初始化画面 clear echo -ne "\033[2J" echo -ne "\033[${height};0H" for ((i=0; i<$width; i++)); do echo -n "-"; done # 游戏主循环(示例) echo -ne "\033[5;5H$snake" echo -ne "\033[3;8H$food"扩展建议:
- 结合
stty设置非阻塞输入 - 使用
tput获取终端尺寸 - 添加分数计算和碰撞检测
