Bash学习之后台运行jar程序

# 不挂断, 后台运行jar程序
nohup java -jar xxx.jar >log 2>&1 &

解释:

  • 上面的调用表明将xxx.jar的输出重定向到log文件中,同时将标准错误也重定向到log文件中,最后一个&表示后台运行。
  • 每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。
  • 2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。
  • 文件描述符1和2都指向了log文件,也就是:将标准错误输出重定向到文件中。
  • why?以这样的方式调用脚本,可以很好的将错误信息保存,帮助我们定位问题。
  • >& 等价于 &>
  • command >file 2>&1==command 1>file 2>&1

(完)

shell 中!叫做事件提示符,英文是:Event Designators,可以方便的引用历史命令, 也就是history中记录的命令

  1. ! 当后面跟随的字母不是空格、换行、回车、=和 ( 时,做命令替换
  2. !n 会引用history中的第n个命令,比如输入!100,就是执行history列表中的第100条命令
  3. !-n 获取history中倒数第N个命令并执行,比如输入!-1,就会执行上一条命令;
  4. !!是!-1的一个alias ,因为执行上一条命令的情况比较多一些,一般如果只是执行上一条命令只按下键盘中的↑即可,有时候如果命令前加点东西执行起来会快一点
  5. !string引用最近的以 string 开始的命令。这条命令在你运行一个命令之后忘记了这个命令的参数是什么,直接!命令既可
  6. !?字符串 指向最近一次包含此字符串的命令
  7. !$传递上一个命令中的参数
1.
> history | grep echo
1013  2012-12-20 12:24:40 echo ""
1014  2012-12-20 12:24:45  echo "22"
> !1014
 echo "22"
22
2.
> !-1
 echo "22"
22
3.
> apt-get install xxx    //Permission Denied. You need to be sudo to do this!
> sudo !!   
4.
> echo "123" "213" "33"
123 213 33
> !echo
echo "123" "213" "33"
123 213 33
5.
> !?123
echo "123" "213" "33"
123 213 33
6.
> ls -l
> ls !$

| 为管道符号,将 “|” 前面命令的输出作为 “|” 后面的输入。
|| 或执行
& 并执行,不短路
&& 并执行,短路

一. Bash = 命令 + 参数

参数之间多余的空格, Bash会自动忽略
echo hello world
上面其实是两个参数, Bash 使用空格(或 Tab 键)区分不同的参数。

二. type命令告诉我们,echo是内部命令,ls是外部程序

命令分为builtin内建和hashed 外部程序(/bin/下)
type命令的-t参数,可以返回一个命令的类型(五类):
别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)。

三、模式扩展(globbing)

bash支持8种globbing扩展,glob N-COUNT. 水滴。
其中用到一些通配符号,叫通配符扩展(wildcard expansion)
Bash 是先进行扩展,再执行命令。
模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。

? 单个
* 0~多个
[abc] 单个
[^abc] or [!abc] 排除 [[abc] 包含'[' [-abc]or[abc-] 包含'-' [a-b] [A-B] 代表a到b,并不包含'-'
[!a-zA-Z]
{
    
    1,2} 不是文件名扩展,总是会挨个输出
a.log{
    
    ,.bak} 代表 '空'a.log 和 a.log.bak
{
    
    a..c} a b c {
    
    5..1} 5 4 3 2 1 {
    
    c..a} c b a
{
    
    }扩展通常作为创建时的参数
for i in {
    
    1..4}
do
	echo $i
done
{
    
    start..end..step} {
    
    0..8..2} 0 2 4 6 8
变量扩展:bash视$开头的为变量。$SHELL == ${SHELL}
${!string*}${!string@}返回所有匹配给定字符串string的变量名。
子命令扩展:$()该命令的所有输出都会作为返回值
算术扩展$(( )):echo $((2 + 2))
量词语法:
?() 0,1
*() 0,1,~
+() 1,~
@() 1
!() 0,~

$ ls abc?(.)txt
abctxt abc.txt
shopt命令调整 Bash 的行为,与模式扩展有关
# 打开某个参数
$ shopt -s [optionname]

# 关闭某个参数
$ shopt -u [optionname]

# 查询某个参数关闭还是打开
$ shopt [optionname]
eg
dotglob参数可以让扩展结果包括隐藏文件(即点开头的文件)
nullglob参数可以让通配符不匹配任何文件名时,返回空字符
failglob参数使得通配符不匹配任何文件名时,Bash 会直接报错,而不是让各个命令去处理。
extglob参数使得 Bash 支持 ksh 的一些扩展语法。比如量词语法
nocaseglob参数可以让通配符扩展不区分大小写
globstar参数可以使得**匹配零个或多个子目录。该参数默认是关闭的
正则表达式
	String regex = "20\\d\\d";
    System.out.println("2019".matches(regex)); // true

.any 正则表达式a.c中间的.可以匹配一个任意字符且仅限一个字符(不包括0个)
\\dnumber \\Dno number
\\&匹配特殊字符&的,正则表达式有特殊字符,那就需要用\转义,因为\也是Java字符串的转义字符,两个\\实际上表示的是一个\
\\wword \\W no words 等价与 [A-Za-z0-9_]
\s匹配一个空格字符或tab字符

  • 用于重复匹配的修饰符:
    • *可以匹配任意个字符
    • +可以匹配至少一个字符
    • ?可以匹配0个或一个字符
    • {n}精确指定n个字符。{n,}代表没有上限

^表示开头,$表示结尾

		// 使用括号()来进行分组匹配
		Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
        Matcher m = p.matcher("010-12345678");
        if (m.matches()) {
    
    
            String g1 = m.group(1);
            String g2 = m.group(2);
        }
        m.reset(); //引擎会把匹配到的字符串去掉,方便下次一匹配(find()),这里是重置。
        while(m.find()){
    
    
        	String group = m.group();
        	group.soutv;
        }
        m.lookingAt(); //从开始的位置查找
        if(m.find()){
    
    
        	m.start() + "-" + m.end() // 开始位置,结束位置
        }

正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配,在规则后面加个?即可表示非贪婪匹配(注意使用括号括起来,如 (\d+?)(0*) )
(\d??)(9*) 匹配 “9999”,因为使用了非贪婪,所以第一组匹配了“”空字符串,注意\d?表示匹配0个或1个数字,后面第二个?表示非贪婪匹配
String.split()方法传入的正是正则表达式
String.replaceAll(),它的第一个参数是正则表达式,第二个参数是待替换的字符串。传入的第二个参数可以使用$1、$2来反向引用匹配到的子串(必须使用括号分组)

非捕获元 ?=、?!、?<=、?<!

exp1(?=exp2):查找 exp2 前面的 exp1。 先行断言(lookahead)
(?<=exp2)exp1:查找 exp2 后面的 exp1。 后行断言(lookbehind)
exp1(?!exp2):查找后面不是 exp2 的 exp1。 先行断言(lookahead)
(?<!exp2)exp1:查找前面不是 exp2 的 exp1。 后行断言(lookbehind)

先行断言(lookahead) 和后行断言(lookbehind)它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为"零宽"。

case: 判断是否包含大小写字母,数字和特殊字符
String regexZST = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$";

猜你喜欢

转载自blog.csdn.net/howeres/article/details/108047742