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

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

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

# Check downloaded packages, pkg repository.
[ -f ${STATUS_FILE} ] && . ${STATUS_FILE}

${STATUS_FILE} 变量定义的文件是conf/global中,具体位置如下:

从图中可以看出,该变量的值来自另一变量,继续拿出来分析:

export RUNTIME_DIR="${ROOTDIR}/runtime"
export STATUS_FILE="${RUNTIME_DIR}/install.status"

${ROOTDIR}上面已经分析过了,这是脚本执行的绝对路径,从${STATUS_FILE}词的意思可以理解为这个变量是安装状态的变量,作者定义它是为了判断安装状态。${RUNTIME_DIR},也就是所有后面软件安装时的状态都会以文件形式存放在这个目录里。

[-f  ${STATUS_FILE} ]        -f filename  如果 filename为常规文件,则为真  [ -f /usr/bin/grep ]

&&   &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行

显然这句的意思是判断这个状态文件是否存在,如果存在,把该文件里的一些变量值读入到进程中,我觉的这是为了解决安装过程中断后,再次安装时,可以继续安装而设置的。继续下面的语句

if [ X"${status_get_all}" != X"DONE" ]; then
cd ${ROOTDIR}/pkgs/ && bash get_all.sh
if [ X"$?" == X'' ]; then
cd ${ROOTDIR}
else
exit
fi
fi

程序中的${status_get_all},如果这个变量的值不是DONE,那么程序就会进入到PKGS里,执行get_all.sh,文件的具体分析见下面:

get_all.sh下载安装文件的脚本分析

执行完上述脚本,获得了安装包,我们继续分析代码如下:

chmod go+rx /dev/null /dev/*random &>/dev/null

作者在此加了注释,给这些文件读写权限,是为了防止某些系统不支持,而导致安装过程中断。

check_env函数解析

iredmail安装脚本分析(一)---iRedmail.sh的更多相关文章

  1. iredmail安装脚本分析(二)---get_all.sh 文件所在目录为PKGS

    经过上面的一系列分析后,进入到获取安装包的步骤,作者在此处单独写了一个脚本,get_all.sh,我们继续分析这个脚本 _ROOTDIR="$(pwd)" CONF_DIR=&qu ...

  2. iredmail安装脚本分析(三)---conf/global DISTRO值的来源及操作系统的判断

    作者在引入conf/global 文件时,就已经对操作系统的类型进行判断,同时也对DISTRO进行了赋值. 部分代码,如图: 显然文件里的KERNEL_NAME的值就是判断完成的操作系统,具体分析该值 ...

  3. fabric-network_setup.sh安装脚本分析

    在进行镜像安装前,提供了一个sample脚本的下载,可以使用该脚本进行容器的启停.这里对该脚本进行分析. fabric/release/linux-amd64/network_setup.sh 脚本提 ...

  4. fabric镜像安装脚本分析

    #!/bin/bash # # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # e ...

  5. Hadoop的shell脚本分析

    你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是 ...

  6. hadoop启动脚本分析及常见命令

    进程------------------ [hdfs]start-dfs.sh NameNode NN DataNode DN SecondaryNamenode 2NN [yarn]start-ya ...

  7. python3自动安装脚本,python3.x与python2.x共存

    1.前言: python3过程中,通过搜索一些文章参考安装过程发现比较麻烦,而且还出现一些不可预期的报错.python3环境需要升级openssl,所以为了部署到其他环境更方便,写自动安装脚本方式,且 ...

  8. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  9. [转帖]CentOS下iRedMail安装配置

    CentOS下iRedMail安装配置 中文名为艾瑞得邮件,由 rhms 项目更名而来.是针对 Linux 设计的邮件服务器解决方案,是在操作系统安装好后使用的一套 shell 脚本,用于快速部署一套 ...

随机推荐

  1. Python自动化测试 (九)urllib2 发送HTTP Request

    urllib2 是Python自带的标准模块, 用来发送HTTP Request的.  类似于 .NET中的,  HttpWebRequest类 urllib2 的优点 Python urllib2 ...

  2. Bootstrap<基础十一>字体图标(Glyphicons)

    字体图标(Glyphicons),并通过一些实例了解它的使用.Bootstrap 捆绑了 200 多种字体格式的字形. 获取字体图标 我们已经在 环境安装 章节下载了 Bootstrap 3.x 版本 ...

  3. MicroERP软件更新记录2.1

    最新版本:2.1 更新内容:新增客户关系管理(CRM) 下载地址:http://60.2.39.130/microerp 因部分企业用户或个人(开发者)的实际应用水平或技术开发能力参差不齐,且软件开发 ...

  4. jQuery focus、blur事件 添加、删除类名

    jQuery.focusblur = function(ele,className){ var focusblurid = $(ele); focusblurid.focus(function(){ ...

  5. 学习asp.net比较完整的流程[转]

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NE ...

  6. [小菜随笔]新手使用appium+python进行自动化测试过程中webdriver.Remote报错的错误分析方法(带实例)

    很多人刚开始使用python+appium去执行APP自动化的时候经常会遇到webdriver.Remote,报错位置指向都是driver = webdriver.Remote('http://127 ...

  7. Linux Shell脚本编程--Head/Tail命令详解

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾,看看下面的范例:## ( ...

  8. #HTML:無序、有序與定義清單

    #HTML:無序.有序與定義清單 Maplewing 于 星期六, 12/10/2013 - 09:48 提交 清單在網頁中是很常使用到的東西,故多少還是要了解一下.在HTML中有三種不太一樣的清單, ...

  9. HTML5和CSS3的一些新特性

    html5有哪些新特性.移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 新特性: 1. 拖拽释放(Drag and drop) 2. 语义化更好的内容标 ...

  10. js⑧

    window对象表示浏览器中打开的窗口, 它是JavaScript浏览器对象模型中的顶层对象.其中还包括了 - Document: 使我们可以从脚本中对 HTML 页面中的所有元素进行访问. - Hi ...