编写好的Shell脚本
一个好的脚本的要素
这是继上一篇Shell脚本教程之后,我们需要一些东西要考虑:
- 脚本应该是无错误(error)的运行
- 脚本应该按照我们预想的轨迹进行执行
- 脚本的逻辑必须清晰
- 不做无用的事情
- 代码最好是可复用的
代码结构
shell脚本的代码结构是非常灵活的。尽管Bash赋予了使用者极大的自由,但是你的代码最好要能够拥有明确而正确的逻辑以便用户可以容易的使用。当你想要书写shell的时候,请一定扪心自问以下几个问题
- 是要求用户输入参数和信息还是从用户的环境中取获取这些参数和信息呢?
- 我该如何保存这些参数和信息呢
- 是否需要创建新文件呢?创建的所有者和权限值呢?
- 我该使用什么命令来达成目的呢?在需要运行的系统上是否有这些命令?移植性如何呢?
- 使用者是否需要一些文字提示?什么时候以及提示内容是什么呢?
属于
还是约定一下术语
术语 | 含义 |
Command control | 通过命令的返回值来确定语句是否已经执行 |
Conditional Branch | 用来判断事件是否发生的程序点 |
Logic Flow | 程序的整体设计,以便确定程序的执行是按照我们期望的逻辑和顺序执行的 |
Loop | 执行0-多次的程序块 |
User Input | 再程序运行时候由外部提供的信息,可以在程序中一次或者多次的使用 |
有序的程序
在咱们开发shell脚本之前,为了提高开发的进度,应该先想一想程序的逻辑。
一段即将使用的方法以及经常会使用的命令列表,并列出咱们即将要做的事情以及程序允许做什么事情,一些明显的任务就会显露出来。
用咱们最熟悉的语言将程序描绘出来并找出主干的行为可以令写出的程序更加的易懂。然后就可以将这些语言全部替换为shell了。
一个Bash的例子
下面的这个shell会使用一些著名的shell命令来查看你的电脑信息
cat -n mysystem.sh #!/bin/bash echo "this is my system info ,and now program start" echo "hello $USER" echo echo "today's date is `date`, this is week `date +"%V"`." #注意+号后面不能有空格哟 echo echo "these user are currnt conneted:" w | cut -d "" -f 1 - | grep -v USER | sort -u echo echo "this is `uname -s` running on `uname -m` processor." echo echo "this is uptime information" uptime echo echo "that's all forks!"
shell脚本应该由#!来开头,在第一行定义之后,shell命令就可以执行了。上述的程序就不解释了,命令不懂的就自行百度吧。太累了唉。
用printf内建命令输出的话,上面的脚本就是这个样子
cat mysystem.sh #!/bin/bash clear printf "This is information provided by mysystem.sh. Program starts now. " printf "Hello, $USER. " printf "Today's date is `date`, this is week `date +"%V"`. " printf "These users are currently connected: " w | cut -d " " -f 1 - | grep -v USER | sort -u printf " " printf "This is `uname -s` running on a `uname -m` processor. " printf "This is the uptime information: " uptime printf " " printf "That's all folks! "
标准安装路径
bash的标准安装路径是再/bin下
如果标准输出无效(例如non-interactive模式下)
如果从cron启动脚本,请输入全路径并重定向输出和错误,因为在non-interactive模式下运行的脚本遇到任何错误都会直接退出,如果你不考虑它的话。
启动脚本的例子
启动脚本是将一个服务在linux或者unix机器上启动起来的脚本。包括系统日志管理后台进程、电源管理后台进程、email和name后台进程都是比较好的例子。这些脚本,也就是启动进程,被编排在一个特殊的位置,例如/etc/rc.d/init.d或者/etc/init.d. 一个名叫Init的初始化进程读取其配置文件来决定哪个脚本是启动还是不起动以及在哪个run-level启动。run level就是一个进程的配置文件。每个操作系统都会有但用户操作run level用来操作管理员的命令,如将磁盘从备份中恢复过来。包括重启和关机这样的操作也都是有运行层级的。
启动脚本是启动还是关闭的操作已经写再脚本中了,设置启动脚本是管理员的一个任务,但是执行这样的任务最好是再你对启动关闭脚本有深刻理解并且能够在正确时候使用的能力的时候。建议查看init命令的man手册并且查看inittab的相关内容
#!/bin/bash # This script is for /etc/rc.d/init.d # Link in rc3.d/S99audio-greeting and rc0.d/K01audio-greeting case "$1" in 'start') cat /usr/share/audio/at_your_service.au > /dev/audio ;; 'stop') cat /usr/share/audio/oh_no_not_again.au > /dev/audio ;; esac exit 0
这里出现的case语句将会在之后的随笔中讲解