效果图:
脚本:
#!/bin/bash
# 定义一个变量,用来存储输入的内容
input=""
# 定义一个变量,用来存储输入的字符
char=""
# 为了让read能读到空格键
IFS_store=$IFS
IFS=''
# 提示内容,在while循环中也有,如果要修改,需要一并修改
echo "回显:"
echo -n "请输入:"
# 定义一个循环,直到输入回车键为止
while true; do
# 读取一个字符,不显示在屏幕上
read -s -n 1 char
# 判断是否是回车键
case $char in
"")
break
;;
*)
true
;;
esac
# 判断是否是退格键
if [ "$char" == $'\b' ]; then
if [ ${#input} -eq 0 ];then
continue
fi
# 删除最后一个字符
input=${input:0:-1}
# 在第二行显示删除后的内容,并清除多余的字符
echo -en "\r\033[K请输入:$input"
# 回到第一行,并清除多余的字符
echo -en "\r\033[1A\033[K"
# 在第一行显示删除后的内容,并换行到第二行
echo -e "回显:$input\r"
else
# 将输入的字符拼接到变量中
input="$input$char"
# 在第二行显示拼接后的内容,并清除多余的字符
echo -en "\r\033[K请输入:$input"
# 回到第一行,并清除多余的字符
echo -en "\r\033[1A\033[K"
# 在第一行显示拼接后的内容,并换行到第二行
echo -e "回显:$input\r"
fi
# 在显示输入内容后,让光标向右移动输入内容的长度,这样就可以让光标停在第二行的最后一个字符处
# +8是因为第二行有“请输入:”这几个字,需要额外增加长度
echo -en "\033[$((${#input} + 8))C"
done
# 恢复IFS变量
IFS=$IFS_store
# 在第三行显示最终的结果,并清除多余的字符
echo -e "\r\n\033[2B\033[K最终输入内容: $input"