先占坑,回头补充完善哈

Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
 
windows下是否可执行是由扩展名决定的,但在Linux系统,程序是否可执行是由有没有x权限决定的,为了区分不同的文件类型,shell类型文件一般加.sh后缀。

创建shell文件:vi shell.sh,然后直接编写就好了

执行shell脚本:1、子程序的话bash shell.sh或sh shell.sh,父程序的话source shell.sh,要求shell文件有r权限,bash和source两种方式区别这里就不展开了;
        2、./shell.sh直接执行,要求shell文件有r+x权限

Shell有两种执行命令的方式:
交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

先写个简单的自动启动tomcat的shell程序(批处理):

 1 #!/bin/bash
 2 # Program:
 3 # This program is used to start tomcat.
 4 # History:
 5 # 2016/09/11 XH First release
 6 pid=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`
 7 #变量名=`命令`,变量与等号之间不能有空格
 8 if [ $pid ]
 9 #[]里头必须有空格
10 then
11     echo 'Tomcat is already running..'
12 else
13 
14     /usr/local/tomcat7/bin/startup.sh
15     echo 'Tomcat has just been started..'
16     tail -f /usr/local/tomcat7/logs/catalina.out
17     #启动的同时查看日志文件
18 fi

考虑到如果这个shell文件名起名叫start_tomcat.sh,因为包括关键字tomcat,在运行时shell进程的pid也会被获取,那应该运行不到else语句,无法顺利启动tomcat,但是测试了下发现虽然报了个错但tomcat还是启动了,于是简单改了下脚本验证运行结果:

 1 #!/bin/bash
 2 pid=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`
 3 ps -ef|grep tomcat|grep -v grep|awk '{print $2}'
 4 echo $pid
 5 if [ $pid ]
 6 then
 7         echo 'Tomcat is already running..'
 8 else
 9         echo 'Tomcat has just been started..'
10 fi

下面是运行结果:

root      8305  6086  0 07:17 pts/0    00:00:00 /bin/bash ./start_tomcat.sh
8305 8306
./start_tomcat.sh: line 5: [: 8305: unary operator expected
Tomcat has just been started..

可以看到,除了shell进程,后面又多了个pid是8306的进程,不太明白这个进程是干什么用的,但似乎是因此导致的if判断失败而执行else语句
为了查明报错是因为有$pid有多行值还是因为包含了shell进程,我又用lampp尝试了下(lampp启动状态,但文件名没有lampp,这样$pid会有多行值但不包含shell进程的pid
),确实仍旧执行了else语句,但报的错不一样:line 5: [: too many arguments
虽然还不是太明白原因,但总之这类脚本以后尽量避免命名含grep关键字,免得出现奇怪的问题,如果非要这么命名,就把grep关键字设成程序的绝对路径。

 

posted on 2016-09-12 12:22  鲜花阿姨  阅读(317)  评论(2编辑  收藏  举报