很久没写shell,今天要写个监控脚本,还是shell来得快,于是捡起来。
需求非常简单,对于htdocs目录,递归地遍历每个子目录,并对其中每一个php文件进行代码语法检查,以保证系统健康。
1、shell函数
非常简单,用不用function这个关键字声明无所谓,函数名后有没有括号也无所谓,但还是加上好了,便于别人阅读
与其他语言不同,函数名后不必跟参数列表,调用时和命令行调用一下,直接函数名后面写就OK
function check() {
if [ $# -eq 1 ]; then
echo $1
fi
}
check aaa
2、shell的控制语句
1)shell的比较,字符串间的比较用=,整数间的比较用-eq,这个-不可少哦,否则报语法错误,还有就是字符串比较时虽然用“=”,但这个“=”号两边必须要有空格,否则就变成赋值语句了,即if里的条件返回值永远会是真, 这个鼓捣了半天,汗。。。
正确写法:
if [ "$RES" != "No“ ]
2)if后的[和],两边都要有空格,吃过这个亏,所以这次没犯
3)for lf in /file/*,查看/file目录下所有文件,也曾想用for lf in ·ls /file·,但这样返回的只是文件名,而我需要的是全路径加文件名
3、shell的字符串操作
想要一个判断,即文件名是否.php结尾,因文件名是现成的,所以优先选择字符串截取,有几种方式
1)${varname:offset:len},例:
varname="abc"
echo ${varname:1:2} //bc
但我想从后往前截的,于是看网上说可将offset置为负数,试了一下echo ${varname:-1} ,返回的是"abc",看来不符合需求
2)${varname##*string},例
varname="abc.php"
echo ${varname##*.} // php,符合需求了。
类似的还有${varname#*string} ${varname%%*string} ${varname%*string} 有兴趣用到时可看下
3)if [[ $F == *.php ]] ,这个最简单直接了,判断$F是否是以.php结尾,但要注意这里双”[“”]“哦
4、调试
加上-n参数,检查语法错误,加上-x参数,可以看到程序执行时的每条命令,还是非常好的!不然echo死人了!