在 bash 中使用命令栏而不使用 I/O?

在 bash 中使用命令栏而不使用 I/O?

我真的很喜欢输出的外观bar

但该脚本仅用于输入/输出操作。

我如何使用它来代替睡眠但具有视觉反馈?

sleep 10

答案1

我看不到使用 来做到这一点的方法bar。但是,您可能对执行相同操作的其他命令感兴趣,它们可能更适合您的需求。

方法#1——假装

此方法将简单地用较大的进度条覆盖之前显示在屏幕上的内容。简单但有效。

例子,ex.bash

#!/bin/bash

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

方法#2 - 管道视图

该命令pv提供进度条功能。您可以在这篇文章中看到更详细的示例:您应该了解的 Unix 实用程序:Pipe Viewer

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

方法#3 - 旋转器

您可以使用以下示例代码通过简单的循环构建您自己的“旋转器”。在循环中您可以嵌入任何您喜欢的命令。这段代码来自这篇文章,标题为:我可以在 Bash 中做一个旋转器吗?

#!/bin/bash

sp='/-\|'
printf ' '
for i in $(seq 3); do
  printf '\b%.1s' "$sp"
  sp=${sp#?}${sp%???}
  sleep 1
done
echo ''

方法#4 - 对话框

有一个命令dialog可以满足您的要求。它使用图形对话框,但它们是基于 ncurses 的,因此只要支持 ncurses,它们就可以在大多数终端和/或脚本中工作。你可以看到所有dialog项目网站上的文档

截屏

SS 规格

参考

答案2

实施起来似乎微不足道。下面(栏)的 bash 函数的行为类似于您的bar脚本(基于简短的截屏视频)。它还会根据终端宽度动态调整大小(在下次调用 时bar)。

#!/bin/bash

#Helper functions
terminal_width(){
  local width_height=`stty size`
  echo ${width_height/* /}
}
string_times_n(){
  local s=$1
  local n=$2
  for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
  local percentage=$1
  local padding=10
  local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
  local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
  local dots_n=$((width - equals_n))

  #ANSI escape sequence magic
  local Esc="\033["
  local up="$Esc""K""$Esc""1A""$Esc""K"

  #Clear the line
  string_times_n ' ' "$width"
  echo -ne "\r"

  #Print the current screen
  printf  "%3s%% [" "$percentage"
    string_times_n '=' "$equals_n"
    string_times_n '.' "$dots_n"
  echo -n "]"

  #Go up unless finished
  if [[ "$percentage" == 100 ]] 
  then
    echo
  else
    echo -e "$up"
  fi
}

用法

. bar.sh #Assuming it's saved in bar.sh
bar $percentage

定期进度示例:

for i in {1..10}; do bar $((i*10)); sleep 0.1; done;

随机进度示例:

for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;

相关内容