shell脚本实现多彩进度条

时间:2019-06-14 12:53来源:计算机教程
先贴代码 Linux设计理念 1.一切皆文件:是 Unix/Linux 的基本理念之一。2.单一用途的程序组成,保证linux内核的高效运行。3.联接程序,共同完成复杂功能;保证简单功能的高效性,复杂的

先贴代码

Linux设计理念

1.一切皆文件:是 Unix/Linux 的基本理念之一。
2.单一用途的程序组成,保证linux内核的高效运行。
3.联接程序,共同完成复杂功能;保证简单功能的高效性,复杂的程序也必然是高效性的。
4.避免交互界面;通过简洁的命令行实现 排错,修改系统的配置,一切都是简洁明了为基础       
5.提供机制,而非策略 
6.Linux所有的配置信息都存放在文本文件中,修改配置只需修改其配置文件。

    Linux作为自由软件(GNU),同时也遵循自由软件的思想:
    自由使用
    自由学习和修改
    自由分发
    自由创建衍生版

#!/bin/bash
i=0;
str=""
arr=("|" "/" "-" "\")
while [ $i -le 100 ]
do
  let index=i%4
  let indexcolor=i%8
  let color=30 indexcolor
  printf "e[0;$color;1m[%-100s][%d%%]%cr" "$str" "$i" "${arr[$index]}"
  sleep 0.1
  let i  
  str ='='
done
printf "n"

1、PS1——默认提示符

Linux下的默认提示符
我们通过修改,可以使其显示用户名、主机名和当前工作目录。
-bash-3.2$ export PS1="u@h w> "
ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[注: 提示符修改为 "username@hostname current-dir>的形式]
本例中PS1使用的一些代码如下:
o u -- 用户名
o h -- 主机名
o w -- 当前目录的完整路径。请注意当你在主目录下的时候,如上面所示只会显示~
注意,在PS1值之后有一个空格。从个人角度来讲,使用这个空格可以增加一定的可读性。
将export PS1=”u@h w>" 添加到.bash_profile 或者 .bashrc中,则可以保证其永久有效。
ramesh@dev-db ~> vi ~/.bash_profile
ramesh@dev-db ~> vi ~/.bashrc
[注: 将命令添加到以上任何一个即可]

环境变量PS1(命令提示符),可以使用vi编辑/etc/profile文件,在最后加上:export PS1=’[u@h W]$ ‘即可,其中u显示当前用户账号,h显示当前主机名,W显示当前路径,$显示’$'符号
  
W 代替 w 就可以实现绝对路径到相对路径的转换
  
  d :代表日期,格式为weekday month date,例如:”Mon Aug 1″
  H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
  h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
  t :显示时间为24小时格式,如:HH:MM:SS
  T :显示时间为12小时格式
  A :显示时间为24小时格式:HH:MM
  u :当前用户的账号名称
  v :BASH的版本信息
  w :完整的工作目录名称。家目录会以 ~代替
  W :利用basename取得工作目录名称,所以只会列出最后一个目录
  # :下达的第几个命令
  $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

颜色设置
  PS1=”e[1;32mue[me[1;33m@e[me[1;35mhe[m:w$ "
PS1="[e[31m][u@h W]$[e[0m]"

e[1;xxm和e[m就是改变终端字体颜色的部分,前者是修改颜色,后者是恢复到正常显示。但是 这时还会有问题,在提示符中输入第一行时,回车换行不正常,导致显示很混乱,因此,除了这个修改之外,还需要将全部非打印字符用专用的 bash 转义序列 "[" 和 "]” 括起来。这两个序列通知 bash,被括起来的字符不占用行 上的任何空间,这样就使自动换行能够继续正常工作。

最终版本如下(可解决带颜色提示符的不换行问题):
  PS1=”[e[1;32m]u[e[m][e[1;33m]@[e[m][e[1;35m]h[e[m]:w$ “
  其中,颜色表示为:30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white。
  如果需要改变目录在命令行下显示颜色:
  1、将/etc/DIR_COLORS文件cp到~/下,并改名为.dir_colors。
  2、编辑.dir_colors文件,找到“DIR 01;34 # directory”,将34改为36。
  你可以找到文件的两行注释:
  # Text color codes:
  # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
  按照颜色对应的数字,你还可以把目录显示颜色改成其他的。
  同样其他的显示效果(包括背景)也可以参照说明进行修改。
  这样你就可以定制自己的linux下命令行方式下的个性化显示效果了。
  3、重新登录,就可以看到修改后的效果了。

在Linux终端下调试程序时,有时需要输出大量信息。若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。
终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。
转义序列以控制字符'ESC'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以'ESC'和左括号'['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由'\033['或'e['代替。
通过转义序列设置终端显示属性时,可采用以下格式:
\033[ Param {;Param;...}m 或 e[ Param {;Param;...}m
其中,'\033['或'e['引导转义序列,'m'表示设置属性并结束转义序列。Param为属性值,{...}表示可选(多个参数之间用分号隔开,与顺序无关)。
注意,转义序列可被控制字符'CAN'(Cancel )和'SUB'(Substitute)中断。
转义序列相关的常用参数如下(通过man console_codes命令可查看更多的参数描述):
显示:0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)
颜色:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)
前景色为30 颜色值,如31表示前景色为红色;背景色为40 颜色值,如41表示背景色为红色。
调色效果如下图所示:

图片 1

 因此,通过转义序列设置终端显示属性时,常见格式为:
 \033[显示方式;前景色;背景色m输出字符串\033[0m 或 e[显示方式;前景色;背景色m输出字符串\033[0m
 此外,还有一些ANSI控制码,如:nA (光标上移n行 )、nB(光标下移n行 )、nC(光标右移n行 )、nD (光标左移n行 )、2J(清屏)、K(清除从光标到行尾的内容)、s(保存光标位置)、u(恢复光标位置)、?25l(隐藏光标)、?25l(显示光标)。     其中 ,'\033[0m'用于恢复默认的终端输出属性,否则会影响后续的输出。

没错代码就这么简单 其实前面的都差不多就是下面的输出时颜色控制线面我们就介绍一下颜色控制的原理

2、PS2——再谈提示符

一个非常长的命令可以通过在末尾加“”使其分行显示。多行命令的默认提示符是“>”。 我们可以通过修改PS2 ,将提示符修改为"continue->" 。
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state  
> --key_buffer_size=512M --sort_buffer_size=512M  
> --read_buffer_size=4M --write_buffer_size=4M  
> /var/lib/mysql/bugs/*.MYI
[注: 这里使用 ">" 作为默认提示符]
ramesh@dev-db ~> export PS2="continue-> " 
ramesh@dev-db ~> myisamchk --silent --force --fast --update-state  
continue-> --key_buffer_size=512M --sort_buffer_size=512M  
continue-> --read_buffer_size=4M --write_buffer_size=4M  
continue-> /var/lib/mysql/bugs/*.MYI
[注: 与上面类似,用 "continue-> " 作提示符]
当用“”使长命令分行显示,我发现非常易读。当然我也见过有的人不喜欢分行显示命令

终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。转义序列以控制字符'ESC'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以'ESC'和左括号'[‘开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通由‘\033['或‘e['代替。
通过转义序列设置终端显示属性时,可采用以下格式:

3、PS3——Shell脚本中使用select时的提示符

你可以像下面示范的那样,用环境变量PS3定制shell脚本的select提示:
不使用PS3的脚本输出:

ramesh@dev-db ~> cat ps3.sh
select i in mon tue wed exit
do
    case $i in
        mon) echo "Monday";;
        tue) echo "Tuesday";;
        wed) echo "Wednesday";;
        exit) exit;;
    esac
done

ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[注: 缺省的提示符是 #?]
使用PS3的脚本输出:

ramesh@dev-db ~> cat ps3.sh
PS3="Select a day (1-4): "
select i in mon tue wed exit
do
    case $i in
        mon) echo "Monday";;
        tue) echo "Tuesday";;
        wed) echo "Wednesday";;
        exit) exit;;
    esac
done

ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[注: 设置了PS3变量后,命令提示符已经成为 "Select a day (1-4):"]

\033[ Param {;Param;…}m 或 e[ Param {;Param;…}m 

4、PS4——PS4-“set -x"用来修改跟踪输出的前缀

如果你像下面那样在调试模式下的脚本中,PS4环境变量可以定制提示信息:
没有设置PS4时的shell脚本输出:

ramesh@dev-db ~> cat ps4.sh


set –x
echo "PS4 demo script"
ls -l /etc/ | wc –l du -sh ~

ramesh@dev-db ~> ./ps4.sh
       echo 'PS4 demo script'
PS4 demo script
   ls -l /etc/
   wc –l
243
   du -sh /home/ramesh
48K /home/ramesh
[注: 当使用sex -x跟踪输出时的提示符为   ]
设置PS4后的脚本输出:
PS4在ps.sh中定义了下面两个变量
o $0 显示当前的脚本名 
o $LINENO 显示的当前的行号

ramesh@dev-db ~> cat ps4.sh
export PS4='$0.$LINENO  '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3  echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4  ls -l /etc/
../ps4.sh.4  wc -l
243
../ps4.sh.5  du -sh /home/ramesh
48K /home/ramesh
[注: 使用PS4后使 "{script-name}.{line-number} " 成为set –x的命令提示符]

其中,‘\033['或‘e['引导转义序列,‘m'表示设置属性并结束转义序列。Param为属性值,{…}表示可选(多个参数之间用分号隔开,与顺序无关)。 转义序列相关的常用参数如下(通过man console_codes命令可查看更多的参数描述):

显示: 0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)

颜色: 0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)

编辑:计算机教程 本文来源:shell脚本实现多彩进度条

关键词: