编写Shell脚本

编写好的Shell脚本linux

一个好的脚本的要素shell

这是继上一篇Shell脚本教程以后,咱们须要一些东西要考虑:bash

  1. 脚本应该是无错误(error)的运行
  2. 脚本应该按照咱们预想的轨迹进行执行
  3. 脚本的逻辑必须清晰
  4. 不作无用的事情
  5. 代码最好是可复用的

代码结构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语句将会在以后的随笔中讲解

相关文章
相关标签/搜索