# 不挂断, 后台运行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中记录的命令
- ! 当后面跟随的字母不是空格、换行、回车、=和 ( 时,做命令替换
- !n 会引用history中的第n个命令,比如输入!100,就是执行history列表中的第100条命令
- !-n 获取history中倒数第N个命令并执行,比如输入!-1,就会执行上一条命令;
- !!是!-1的一个alias ,因为执行上一条命令的情况比较多一些,一般如果只是执行上一条命令只按下键盘中的↑即可,有时候如果命令前加点东西执行起来会快一点
- !string引用最近的以 string 开始的命令。这条命令在你运行一个命令之后忘记了这个命令的参数是什么,直接!命令既可
- !?字符串 指向最近一次包含此字符串的命令
- !$传递上一个命令中的参数
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个)
\\d
number \\D
no number
\\&
匹配特殊字符&的,正则表达式有特殊字符,那就需要用\转义,因为\也是Java字符串的转义字符,两个\\
实际上表示的是一个\
;
\\w
word \\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,}$";