版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一 文件表达式
常规的
# 特殊-->e是不是一般文件!
if [ -f file ] 如果文件存在(普通文件)
if [ -d ... ] 如果目录存在(directory)
if [ -s file ] 如果文件存在且非空(socket)
if [ -r file ] 如果文件存在且可读(可读)
if [ -w file ] 如果文件存在且可写(可写)
if [ -x file ] 如果文件存在且可执行(可执行)
帮助文档:man test
root:不受权限的影响,注意这一点!
需求1:文件存在并且是普通文件输出1
[ -f temp ] && echo 1 || echo 0
涉及:简单的逻辑控制!
需求2:判断权限
[root@server1 mnt]# chmod 000 temp
[root@server1 mnt]# ll temp
---------- 1 root root 11 Aug 29 12:29 temp
[root@server1 mnt]# [ -r temp ] && echo 1 || echo 0
1
说明:不完全看权限,看最终的结果,针对root权限有时候没有作用!
需求3:shell变量测试
[root@server1 mnt]# file1=/etc/rc.local
# 是不是文件!-->最好加上双引号,表示一个整体!
[root@server1 mnt]# [ -f "$file1" ] && echo 1 || echo 0
1
# 对单个文件或目录变量的测试需要加双引号,避免错误
需求4:将多个命令写到{}中
#!/bin/bash
[ $1 -eq 8 ] || {
echo 1
echo 2
echo 3
}
# 条件表达式判断条件后面执行多条命令语句写法
说明:用{}放多个命令,{}表示后面的命令是一个整体!
条件表达式特点:相对于条件表达式,简洁,短小精悍!
相关对比
1、test 测试表达式
2、[ 测试表达式 ] #两边需要有空格
3、[[ 测试表达式 ]]
4、(( 测试表达式 )) # 无需空格,常规数学符号!
说明:第一种和第二种是等价的,第三种是扩展的test命令(扩展的地方),语法4常用于计算
在[[]] 双中括号中可以使用通配符等进行模式匹配,&& || > < 等操作符可以直接应用于双中括号中,但不能用于单中括号中
二 字符串表达式
-n nonzero ---->长度是不是非0
-z zero ---->字符串的长度是不是非0
"串1" = "串2" ---->两个字符串是不是相等
"串1" != "串2" ---->两个字符串是不是不相等
# 注意1:所有的字符串测试操作必须用""引起来!
# 注意2:比较符号的两端必须有空格
空格导致的问题
[root@server1 mnt]# [ "wzj"="1" ]&& echo 1 || echo 0
1
[root@server1 mnt]# [ "wzj" = "1" ]&& echo 1 || echo 0
0
相关练习
# 以"wzj"载体
[root@server1 mnt]# [ -n "wzj" ] && echo 1 || echo 0
1
[root@server1 mnt]# [ -z "wzj" ] && echo 1 || echo 0
0
[root@server1 mnt]# [ ! -z "wzj" ] && echo 1 || echo 0 # 取反
1
说明:关于变量的省略!
注意:如果变量不存在(未定义),则默认长度为0!
相关模仿
# 定位-->sed -n "30,31p" /etc/init.d/network
vim /etc/init.d/network # 提供的例子
[ "${NETWORKING}" = "no" ] && exit 6
三 整数表达式
特点:文本形式进行数字比较!
注意:不同场景使用不同的符号!
扩展:如果混用,在[]中对于特殊符号(<>)进行比较需要反斜杠\转移!
相关结论
对2的说明
[root@server1 mnt]# [[ 2 > 11 ]] && echo 1 || echo 0
1
# [[]]逻辑比较(第一位)