shell脚本基础

一、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):非正常运行导致退出程序;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值