iredmail安装脚本分析(一)---iRedmail.sh,iredmail安装和配置



iredmail是一套以postfix为核心的整合邮件系统的安装脚本,可以达到快速部署邮件服务器的目的。为了让自己不遗忘shell的语法,所以闲来无事,学习一下他的代码。

我从官网下载他的最新版,解压后,结构如下:

iRedMail.sh  是开始安装的启动文件,执行bash iRedMail.sh 后就开始安装,我们从这个文件看起。

tmprootdir="$(dirname $0)"
 
dirname的用法是:
 
(1)  带全路径的,例:aguo@auto-test:~> dirname /home/aguo/insert.sql 
         /home/aguo #获得文件所在目录
 
(2)  仅仅是文件名的,例:aguo@auto-test:~> dirname Environment 

         .   表示路径就是当前目录

$0 在shell中的意思是当前执行脚本的名称 $() 在shell中起到命令替换的作用,这样tmprootdir的值就为当前执行脚本的目录,在下面要对此目录进行判断

一个命令涉及了3个知识点,看来学习还是能加深印象的。

第二个命令如下:

echo ${tmprootdir} | grep '^/' >/dev/null 2>&1
 
| 管道符 ,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
 
grep ‘^/’  查找以/开头的,grep的正则表达式用法
 
>/dev/null 2>&1  :
 
可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到
 
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
 
2 表示stderr标准错误
 
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
 
很多shell脚本里都会用到,实际作用就是不让输出任何内容

这个命令的整体作用就是为了查找变量tmprootdir的值中以/开头的,下面会根据状态码进行判断

if [ X"$?" == X"0" ]; then
    export ROOTDIR="${tmprootdir}"
else
    export ROOTDIR="$(pwd)"
fi
 
 
 
export  export命令可以用来设置或显示环境变量。在shell中,当一个变量创建时,只会在当前的shell中有 效,之后创建的子进程不会有该变量。而命令export可以将一个shell变量变成环境变量,在随后创建的子进程中也能访问到该环境变量,但是子进程在 修改了环境变量的值之后,父进程并不能知道,因为子进程将复制父进程的环境变量。因此,当shell退出时,那些在该shell中export出来的环境 变量也会消失。
 
这样的话,接下来的脚本中,ROOTDIR的值就会保留下来
 
[ X"$?" == X"0" ]  中的X 是为了防止$?为空的情况下,而设立的,不过网上资料很少提到 $?  执行命令后返回的状态,成功为 0 失败为其他值 if else 判断语句   根据$?的问号的值,来判断脚本的绝对路径  这个判断是针对多系统的,有的系统里得到的dirname里可能会有绝对路径的值,所以echo ${tmprootdir} | grep '^/' >/dev/null 2>&1,如果有值的话,就可以直接判断脚本的绝对路径;如果没值的话,就用pwd重新获得。

确定了脚本所在的系统的绝对路径后,后面就可以对一些函数库和全局变量进行调用了,接下来的代码:

cd ${ROOTDIR}

export CONF_DIR="${ROOTDIR}/conf"
export FUNCTIONS_DIR="${ROOTDIR}/functions"
export DIALOG_DIR="${ROOTDIR}/dialog"
export PKG_DIR="${ROOTDIR}/pkgs/pkgs"
export PKG_MISC_DIR="${ROOTDIR}/pkgs/misc"
export SAMPLE_DIR="${ROOTDIR}/samples"
export PATCH_DIR="${ROOTDIR}/patches"
export TOOLS_DIR="${ROOTDIR}/tools"

. ${CONF_DIR}/global
. ${CONF_DIR}/core

基本包含了系统以后要用到的所有配置文件和具体的变量文件,global是全局的变量文件  core是核心文件,后面会继续分析,从语法看没什么难的,只有. 需要解释一下

.   ${CONF_DIR}/global  这样就把里面的变量或者函数都引入到了脚本的运行中,后面遇到具体的变量再做分析。

 

 

相关内容