今天在资源中上传了一个nginx的软件包,里面有nginx的安装、升级、服务控制、优化、lnmp配置的自动化脚本,大家可以下载使用,也可以前往我的github中查看 https://github.com/SmartLyu/shell

      不过今天还是和大家分享一个用于脚本美观的程序,在任何程序中都可以拿来一用,老规矩,话不多说,先上代码:

# 进度条
jindu(){
  while :
  do
    echo -n '#'
    sleep 0.25
  done
}

jindu &        # 开启进度条

kill $!        # 关闭进度条

-------------------------------------------------------------
# 旋转光标
sleep_time=0.1s        # 光标旋转间隔时间
go_start(){
dead=0                          # 记录休眠时间,当用户未操作一段时间,可能是出现强制退出等其他特殊情况,自动退出
while [ $dead -le $1 ]        # 根据不同的要求设置光标闪烁时间
do
  echo -e '-'"\b\c"
  sleep ${sleep_time}s
  echo -e '/'"\b\c"
  sleep ${sleep_time}s
  echo -e '|'"\b\c"
  sleep ${sleep_time}s
  echo -e '\\'"\b\c"
  sleep ${sleep_time}s
  dead=$[$dead+1]
done
echo -e ' '"\b\c"
}

go_start 10&        # 1秒后自动关闭
kill $!

-------------------------------------------------------------
# 逐字打印
for print_key in 要逐字打印的内容(每个字间有个空格)
do
    echo -n $print_key
    sleep 0.15s
done
echo ''

      这些可以直接套用在已经完工的程序中,例如安装程序,并不希望用户看到安装过程,会选择吧所有的输出全部丢入黑洞,这时候又怕屏幕没有显示用户会着急,就会选择进度条来提高用户体验,再例如我们写的程序对程序介绍,希望用户认真阅读,怕用echo瞬间显示,会让用户不读,可以用逐字打印来实现,而任何情况都可以用旋转光标让程序变的更炫,下面具体介绍一些这三个程序


进度条

      原理很简单,每隔0.25s输出一个#,程序开始时开始执行,程序结束前,将其杀死,为了不阻碍程序正常运行,我们把进度条放入后台,慢慢执行即可。
      也就是说,实际上进度条和程序实际进度没有必然联系,不过我们可以设置多段进度条,没一个模块执行完结束一个进度条,然后再开启一个,进行下一个模块,这样可以更准确的反应程序进度,不过因为整体目的是提高用户体验,其实际作用就没必要纠结了。

      具体使用就是,在程序前编写jindu函数,然后在程序正式命令前调用函数并放入后台,在结束前用kill命令关闭进度条即可。

jindu(){
  while :
  do
    echo -n '#'
    sleep 0.25
  done
}

jindu &
实际作用的脚本命令
………………
…………
kill $!
echo ''
jindu &
再进行一个模块命令
kill $!
………………

旋转光标

      看上去很复杂的一个操作,让光标这竖线可以一直旋转,其实很简单,通过输出删除在输出的方法,具体原理就是,屏幕中输出 |  ,然后echo用\b退格,把上次打的 | 擦除,然后在其位置上写上 \  ,然后反复如此,让 | \ - / 依次在一个字符位上不断覆盖输出,只要有一点速度,人眼的记忆功能,就会看成动感的光标
    其作用和用法和进度条很像,都是为了提高用户体验,也是在命令前开始,结束后关闭,不过和进度条有个不小的区别,进度条所用程序一般是安装程序,用户很少会人为中断,而且人为中断后果很大,所以,一般不用考虑进度条会没有正常关闭,占用命令行的可能,而旋转光标不同,他一般是在既定了具体内容的文本打印的时候使用,而且用户如果不耐烦,比较大概率会突然中止,这时候我们就需要考虑突然中止的问题,而具体办法就是,在旋转光标的函数中内置一个计时器,当到时间任然没有中止命令,会自行中止,其用法就是

sleep_time=0.1s
go_start(){
dead=0                          # 记录休眠时间,当用户未操作一段时间,可能是出现强制退出等其他特殊情况,自动退出
while [ $dead -le $1 ]        # 根据不同的要求设置光标闪烁时间
do
  echo -e '-'"\b\c"
  sleep ${sleep_time}s
  echo -e '/'"\b\c"
  sleep ${sleep_time}s
  echo -e '|'"\b\c"
  sleep ${sleep_time}s
  echo -e '\\'"\b\c"
  sleep ${sleep_time}s
  dead=$[$dead+1]
done
echo -e ' '"\b\c"
}

go_start 具体光标闪烁时间&
执行的命令
…………
kill $!

逐字打印
      这是最简单的,原理就是把一句话的每个字符拆开,用for循环来不断echo出来,而每个字符echo后休眠一点时间,就会变成每个字符都是慢慢打出来的感觉
      具体操作就是把想逐字打印的字符串,每个字符间加个空格,然后用for循环打印出来就好了

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐