先占坑,回头补充完善哈
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关键字设成程序的绝对路径。