条件测试命令
条件测试:判断需求是否满足,有测试过程来实现
实现评估布尔申明,以便在条件性环境下执行
命令若执行为真,则状态码变量$?返回0
命令若执行为假,则状态码变量$?返回1
条件测试命令:
test 表达式
[空格 表达式 空格] 和test等价,建议使用[]
[[空格 表达式(支持正则) 空格 ]]
变量测试
[ -v NAME ] 判断变量是否定义
[ -R NAME ] 判断变量是否定义并且被引用 ;bash 4.4新特性
数值测试
-eq 是否等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
字符串测试
test和[]方式
-z NAME 字符串是否为空,没定义或空为真,不空为假
-n NAME 字符串是否不空,不空为真,空为假 NAME等同
NAME1 = NAME2 是否等同,=前后有空格
NAME1 != NAME2 是否不能等同
> ascii码是否大于ascii码
< 是否小于
[[ ]] 用法:建议需使用正则或通配符才使用
== 通配符方式
=~ 扩展正则表达式方式
IP正则表达式 ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9][0-9]?|1[0-9]{2}|2[0-4][0-9]|25[0-5]) 包含 0.0.0
文件测试
存在性测试
-a file :同-e 是否存在
-e file :文件存在性测试,存在为真,不存在为假
-b file :文件是否是块文件
-c file :是否是字符设备文件
-d file :是否是目录文件
-f file : 是否是普通文件
-h file 或 -L file : 是否是符号链接文件
-p file : 是否为命名管道文件
-s file :是否为套接字文件
文件权限测试
-r file :是否存在且可读
-w file :是否可写
-x file :是否可执行
-u file :是否存在且拥有suid权限
-g file :是否存在且拥有sgid权限
-k file :是否存在且拥有sticky权限
注意:最终结果由用户对文件的实际权限决定,而为文件属性决定 比如root的权限
文件属性测试
-s file 文件是否为非空
-t fd 文件描述符是否在其他终端打开
-N file 上一次读取是否被修改
-O file 当前用户是否是文件属主
-G file 当前用户组是否为文件属组
FILE1 -ef FILE2 file1是否是file2的硬链接
FILE1 -nt FILE2 file1是否新于file2
FILE1 -of FILE2 file1是否旧于file2
(){}批量执行命令
(command1;command2;...)和{空格command1;command2;...;}可以将多个命令组合在一起,批量执行
()会开启一个子shell,里面的变量就只能在子shell上运行
{}不会开启子shell,变量会影响当前环境
$$ $BASHPID不同点
当您使用 $ $时,即使在子 shell 中,它也会存储创建它的父进程的进程 ID。但是 BASHPID 将存储当前进程 ID,即当在括号内调用时,它将存储子进程 ID。$PPID是相对于$$;意味着脚本文件下运行的进程ID。对于任何给定的脚本,当它运行时,它将只有一个“主”进程ID。无论您调用多少个子壳,$$将始终返回与该脚本关联的第一个进程ID。 BASHPID将向您显示当前bash实例的进程ID.
{} 不会开启子shell
组合测试条件
方式一
[ expression1 -a expression2 ] 并且关系
[ expression1 -o expression2 ] 或关系
[[]]不支持
方式二
逻辑与 && 逻辑或 ||
COMMAND1 && COMMAND2 #并且,短路与,代表条件性的AND THEN如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
COMMAND1 || COMMAND2 #或者,短路或,代表条件性的OR ELSE如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
! COMMAND #非,取反
判断ip是否可ping通,只能先 && 在前 ||在后 不能对调
判断账户是否存在,如不存在则创建