系统变量
$?
上一条命令执行后的返回状态。如果正常执行返回为0,否则为1.
$0
当前执行的程序或脚本名称
$#
脚本后面跟的参数的个数
$*
输出脚本后面接的所有的参数,这些参数当成一个整体输出,每个变量参数之间以空格隔开;
$@
输出脚本后面接的所有参数,但这些参数都是独立存在的。
$1~$9
脚本后面的位置参数,如
1
表
示
第
一
个
位
置
的
参
数
‘
1表示第一个位置的参数 `
1表示第一个位置的参数‘
‘
当
前
所
在
进
程
的
进
程
号
;
‘
` 当前所在进程的进程号; `
‘当前所在进程的进程号;‘!后台运行的最后一个进程;
!$`
调用最后一条命令中的参数
#!/bin/env bash
#xxx
echo "\$? = $?"
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$$ = $$"
echo "\$! = $!"
echo "\!$ = !$"
\
是转义符
> chmod +x test.sh
> ./test2.sh a b 3
> //结果:
$? = 0
$0 = ./test.sh
$# = 3
$* = a b 3
$@ = a b 3
$1 = a
$2 = b
$3 = 3
$$ = 15561
$! =
\!$ = !$
四则运算
四则运算的表达式:
$(())
$[]
expr
let
注意在做乘除的时候需要空格,否则会整个输出,如expr 2/2
输出为2/2
。做乘法时不能直接使用*
,因为*有特殊含义,需要使用转义符\
搭配使用。
echo $((1+1)) #2
echo $[2*3] #6
expr 2 / 2 #1
expr 4 \* 2 #8
n=1;let n+=2;echo $n #3
在做小数计算的时候,无法使用上述的方法。我们需要使用bc
工具。
参考下面的链接
小数运算
条件判断
1、判断格式:
test 条件表达式
[ 条件表达式 ]
[[ 条件表达式 ]]
支持正则
使用中括号时,两边需要留有空格。
2、相关参数:
判断整数之间的关系
参数 | 含义 |
---|---|
-eq | 判断是否相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
e就是equal。
#!/bin/env bash
echo "$0"
test 1 -eq 1;echo $?
test 1 -ne 1;echo $?
[ 2 -gt 1 ];echo $?
[ 2 -lt 4 ];echo $?
[ 4 -ge 2 ];echo $?
[ 4 -le 2 ];echo $?
结果:
[root@hadoop01 shell]# ./test3.sh
./test3.sh
0
1
0
0
0
1
判断文件类型
参数 | 含义 |
---|---|
-e | 判断任意类型文件是否存在 |
-f | 判断是否存在并且是一个文件(非目录) |
-d | 判断是否存在并且是一个目录 |
-c | 判断是否存在并且是一个字符文件 |
-s | 判断是否存在并且是一个非空文件 |
-L | 判断文件是否存在并且是一个软连接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
附:软连接创建方式:
ln -s file1 file2
例如,判断一个日志文件:derby.log
test -e derby.log
判断完成后,shell界面并不会返回结果,此时需要我们使用$?
来查看结果。
echo $?
如果返回为0则为真,即目标文件存在,如果为1,则为假,即不存在。
又例如判断目标是否为一个目录。此时返回值为1,即不是目录文件。
[ -d ./derby.log ];echo $?
判断文件权限
参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否sgid,高级权限强制位 |
-k | 是否有t位,高级权限粘滞位 |
>test -r derby.log;echo $?
> test -w derby.log;echo $?
> ...
判断文件的修改时间
参数 | 含义 |
---|---|
-nt | 比较较新的文件 |
-ot | 比较较旧的文件 |
-ef | 比较是否为同一个文件,也可用于判断硬链接,是否指向同一个inode |
判断derby.log文件是否比employee.txt更新
>test derby.log -nt employee.txt ;echo $?
字符串比较
参数 | 含义 |
---|---|
-z | 判断是否为空字符串 |
-n | 判断是否为非空 |
str1 = str2 | 判断字符串是否相等 |
str1 != str2 | 判断两字符串不等 |
test -z "hello";echo $? #1
test -n "hello";echo $? #0
test "hello" = "world";echo $? #1
A="hello"
B="world"
test "$A" = "$B";echo $? #1
多重条件判断
参数 | 含义 |
---|---|
&&和-a | 逻辑与 |
|| 和-o | 逻辑或 |
//-a的用法
test 2 -eq 2 -a 2 -lt 4;echo $?
//&&用法
[ 2 -eq 2 ]&&[ 2 -lt 4 ];echo $?
&& 前面的表达式为真,才会执行后面的代码
|| 前面的表达式为假,才会执行后面的代码