我正在编写安装脚本,并希望在脚本进展过程中显示脚本的状态。
示例:
var1="pending"
var2="pending"
var3="pending"
print_status () {
echo "Status of Item 1 is: "$var1""
echo "Status of Item 2 is: "$var2""
echo "Status of Item 3 is: "$var3""
}
code that does something and then refreshes the
output above as the status of each variable changes.
答案 0 :(得分:18)
这段代码可以给你一个想法:
while :; do
echo "$RANDOM"
echo "$RANDOM"
echo "$RANDOM"
sleep 0.2
tput cuu1 # move cursor up by one line
tput el # clear the line
tput cuu1
tput el
tput cuu1
tput el
done
使用man tput
获取更多信息。要查看功能列表,请使用man terminfo
答案 1 :(得分:2)
看看这个:
while true; do echo -ne "`date`\r"; done
和此:
declare arr=(
">...."
".>..."
"..>.."
"...>."
"....>"
)
for i in ${arr[@]}
do
echo -ne "${i}\r"
sleep 0.1
done
答案 2 :(得分:0)
这并不能完全解决您的问题,但可能有所帮助;要在执行每个命令后打印状态,请修改PS1,如下所示:
PS1='$PS1 $( print_status )'
答案 3 :(得分:0)
您可以使用回车符更改单个状态行上的文本。
n=0
while true; do
echo -n -e "n: $n\r"
sleep 1
n=$((n+1))
done
如果您可以将所有计数器放在一行
n=0
m=100
while true; do
echo -n -e "n: $n m: $m\r"
sleep 1
n=$((n+1))
m=$((m-1))
done
这种技术似乎没有扩展到多行,但它确实比tput更有优势,它适用于哑终端(如Emacs shell)。
答案 4 :(得分:0)
我找到了现有答案中未提及的另一种解决方案。我正在为openwrt开发程序,默认情况下limits
不可用。以下解决方案的灵感来自Missing tput和Cursor Movement。
tput
关于您的问题:
- Position the Cursor:
\033[<L>;<C>H
Or
\033[<L>;<C>f
puts the cursor at line L and column C.
- Move the cursor up N lines:
\033[<N>A
- Move the cursor down N lines:
\033[<N>B
- Move the cursor forward N columns:
\033[<N>C
- Move the cursor backward N columns:
\033[<N>D
- Clear the screen, move to (0,0):
\033[2J
- Erase to end of line:
\033[K
- Save cursor position:
\033[s
- Restore cursor position:
\033[u