functions文件详细分析和说明(2)

很简单,就是不换行带颜色输出"[ OK ]"字样。

[root@xuexi ~]# . /etc/init.d/functions [root@xuexi ~]# success [root@xuexi ~]# [ OK ] [root@xuexi ~]# echo_success [root@xuexi ~]# [ OK ]

同理,剩余的几个状态显示函数也一样。

[root@xuexi ~]# echo_failure [root@xuexi ~]# [FAILED] [root@xuexi ~]# failure [root@xuexi ~]# [FAILED] 2.action函数

这个函数在写脚本时还比较有用,可以根据退出状态码自动判断是执行success还是执行failure函数。

action函数定义语句如下:

action() { local STRING rc STRING=$1 echo -n "$STRING " shift "$@" && success $"$STRING" || failure $"$STRING" rc=$? echo return $rc }

这个函数定义的很有技巧。先将第一个参数保存并踢掉,再执行后面的命令("$@"表示执行后面的命令)。所以,当action函数只有一个参数时,action直接返回OK,状态码为0,当超过一个参数时,第一个参数先被打印,再执行从第二个参数开始的命令。

例如:

[root@xuexi ~]# action [ OK ] [root@xuexi ~]# action 5 5 [ OK ] [root@xuexi ~]# action sleeping sleep 3 sleeping [ OK ] [root@xuexi ~]# action "moving file" mv xxxxxx.sh aaaaa.sh moving file mv: cannot stat ‘xxxxxx.sh’: No such file or directory [FAILED]

所以,在脚本中使用action函数时,可以让命令执行成功与否的判断显得更"专业"。算是一个比较有趣的函数。

通常,该函数会结合/bin/true和/bin/false命令使用,它们无条件返回0或1状态码。

action $"MESSAGES: " /bin/true action $"MESSAGES: " /bin/false

例如,mysqld启动脚本中,判断mysqld已在运行时,直接输出启动ok的消息。(但实际上根本没做任何事)

if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then # already running, do nothing action $"Starting $prog: " /bin/true ret=0 3.is_true和is_false函数

这两个函数的作用是转换输入的布尔值为状态码。

is_true() { case "$1" in [tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE]) return 0 ;; esac return 1 } is_false() { case "$1" in [fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE]) return 0 ;; esac return 1 }

当is_true函数的第一个参数(后面的参数会忽略掉)为忽略大小写的t、y、yes或true时,返回状态码0,否则返回1。
当is_false函数的第一个参数(后面的参数会忽略掉)为忽略大小写的f、n、no或false时,返回状态码0,否则返回1。

4.confirm函数

这个函数一般用不上,因为脚本本来就是为了避免交互式的。在CentOS 7的functions中已经删除了该函数定义语句。不过,借鉴下它的处理方法还是不错的。

以下摘自CentOS 6.6的/etc/init.d/functions文件。

# returns OK if $1 contains $2 strstr() { [ "${1#*$2*}" = "$1" ] && return 1 # 参数$1中不包含$2时,返回1,否则返回0 return 0 } # Confirm whether we really want to run this service confirm() { [ -x /bin/plymouth ] && /bin/plymouth --hide-splash while : ; do echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] " read answer if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then return 0 elif strstr $"cC" "$answer" ; then rm -f /var/run/confirm [ -x /bin/plymouth ] && /bin/plymouth --show-splash return 2 elif strstr $"nN" "$answer" ; then return 1 fi done }

第一个函数strstr的作用是判断第一个参数"$1"中是否包含了"$2",如果包含了则返回状态码0。这函数也是一个不错的技巧。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13446.html