一、shell脚本结构和执行方法
1、在脚本开头放置 #!/usr/bin/env bash (当然也可以放置#!/usr/bin/bash,#!/usr/bin/sh等内容 )
#!/usr/bin/env bash 在不同的系统上提供了一些灵活性。
优点:
1.用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中;
2.它会根据你的环境寻找并运行默认的版本,提供灵活性。(保存用户信息的文件/etc/passwd)
缺点:
有可能在一个多用户的系统中,别人在你的$PATH中放置了一个bash,可能出现错误。
#!/usr/bin/bash:
将对给定的可执行文件系统进行显式控制。
大部分情况下,/usr/bin/env bash是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;而指定具体位置的方式#!/usr/bin/bash,在某些情况下更安全,因为它限制了代码注入的可能。
#!!/usr/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
sh跟bash的区别,实际上是bash有没开启posix模式的区别。sh 遵守posix规范,包括 当某行代码出
错时,不继续往下执行。还有部分命令不能够执行,可能会造成很多意想不到的的错误,sh的优点更
少的磁盘空间、提供较少的功能、获取更快的速度。在通常情况下还是建议用 bash
2、除了第一行的# 其他行的#表示注释。
3、shell脚本结尾用.sh(比如我们java项目里面配置start.sh/setenv.sh/stop.sh)
4、我们在执行脚本的时候一般使用./start.sh ,这种脚本需要执行者有 写的权限,可以通过 chmod 777 start.sh 给予权限。或者用bash start.sh这种方式。
5、也可以查看脚本的执行过程: bash -x start.sh
6、查看脚本是否有语法错误: bash -n start.sh
二、shell脚本一些经常用的命令
source $(dirname $0)/../../env.sh
source 是对应的文件的环境变量生效
$0:当前Shell程序的文件名
dirname $0,获取当前Shell程序的路径
source $(dirname $0)/../../env.sh 使当前shell脚本 上一层目录 上一层目录 的env.sh文件中的环境变量生效
注:
$$
Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
$?
最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$-
显示shell使用的当前选项,与set命令功能相同
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$@ 跟$*类似,但是可以当作数组用
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
if [ -r "$bash_dir/setenv.sh" ];then
. $bash_dir/setenv.sh
fi
-r 判断当前用户是否有权限读取, 上面一句脚本意思,如果对 对应目录下面的setenv.sh有读取权限,则读取对应文件
注:
-d 判断文件是否为目录类型
-e 判断文件是否存在
-f 判断是否为一般文件
-r 判断当前用户是否有权限读取
-w 判断当前用户是否有权限写入
-x 判断当前用户是否有权限执行
逻辑测试:
&& 逻辑与,而且的意思
-e 逻辑或,或者的意思
-f 逻辑否
整数值比较:
-eq 判断是否相等
-ne 判断是否不相等
-gt 判断是否大于
-lt 判断是否小于
-lt 判断是否小于或等于
-ge 判断是否大于或等于
字符串比较符:
= 比较字符串内容是否相同
!= 比较字符串内容是否不相同
-z 判断字符串内容是否为空
echo -n "starting server"
echo -n 不换行输出
echo 换行输出
PID=$(ps -ef | grep hellowrod.jar | grep -v grep | awk '${print $2}')
获取 ps -ef | grep hellowrod.jar 获取运行hellowrod的命令运行情况
grep -v grep 过滤掉 grep 那一行数据运行情况
awk '${print $2}' 获取第二列的运行值
连一起的意思是: 获取hellowrod的命令运行的PID的值赋值给PID
nohup $JAVA $JAVA_OPT -jar lib/hellowrod.jar >$base_dir/nohup.out 2>&1 </dev/null &
nohup command & (terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上))
>./command.sh > output
#这其中的>就是标准输出符号,其实是 1>output 的缩写
>./command.sh 2> output
#这里的2>就是将标准错误输出到output文件里。
>nohup ./command.sh > output 2>&1 &
后台启动command.sh,并且把标准错误(2)重定向到标准输出中(1),而stdout(标准输出)又导入文件output里面
所以结果是stderr(标准错误)和stdout(标准输出)都导入文件output里面了。
这种写法>output 2>output 会使文件output被两次打开,而stdout(标准输出)和stderr(标准错误)将会竞争覆盖,这肯定不是我门想要的.
command <filename 以filename文件作为标准输入
这段话的意思是 通过后台以 $JAVA $JAVA_OPT 方式运行 运行 jar文件,并将 stderr(标准错误)和stdout(标准输出)都导入文件output里面
</dev/null (关于这一部分的解释,如果有知道的希望大神指导)
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;