编写好的Shell脚本linux
一个好的脚本的要素shell
这是继上一篇Shell脚本教程以后,咱们须要一些东西要考虑:bash
代码结构ide
shell脚本的代码结构是很是灵活的。尽管Bash赋予了使用者极大的自由,可是你的代码最好要可以拥有明确而正确的逻辑以便用户能够容易的使用。当你想要书写shell的时候,请必定扪心自问如下几个问题oop
属于this
仍是约定一下术语spa
术语 | 含义 |
Command control | 经过命令的返回值来肯定语句是否已经执行 |
Conditional Branch | 用来判断事件是否发生的程序点 |
Logic Flow | 程序的总体设计,以便肯定程序的执行是按照咱们指望的逻辑和顺序执行的 |
Loop | 执行0-屡次的程序块 |
User Input | 再程序运行时候由外部提供的信息,能够在程序中一次或者屡次的使用 |
有序的程序操作系统
在我们开发shell脚本以前,为了提升开发的进度,应该先想想程序的逻辑。设计
一段即将使用的方法以及常常会使用的命令列表,并列出我们即将要作的事情以及程序容许作什么事情,一些明显的任务就会显露出来。unix
用我们最熟悉的语言将程序描绘出来并找出主干的行为能够令写出的程序更加的易懂。而后就能够将这些语言所有替换为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.\n" printf "Hello, $USER.\n\n" printf "Today's date is `date`, this is week `date +"%V"`.\n\n" printf "These users are currently connected:\n" w | cut -d " " -f 1 - | grep -v USER | sort -u printf "\n" printf "This is `uname -s` running on a `uname -m` processor.\n\n" printf "This is the uptime information:\n" uptime printf "\n" printf "That's all folks!\n"
标准安装路径
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语句将会在以后的随笔中讲解