shell基础-03 测试条件(文件测试、数值比较、字串比较、是否包含)
文章目录
1. 语法
1.1 基本语法
[ 条件表达式 ]
推荐使用
[[ 条件表达式 ]]
该法支持正则
1.2 与
使用
-a
或&&
[ 条件表达式1 -a 条件表达式2 ]
或
[ 条件表达式1 ] && [ 条件表达式2 ]
1.3 或
使用
-o
或||
[ 条件表达式1 -o 条件表达式2 ]
或
[ 条件表达式1 ] || [ 条件表达式2 ]
2. 文件测试
2.1 语法
[ -e dir|file ]
测试文件是否存在
[ -d dir ]
测试是否是目录
[ -f file ]
是否存在,而且是文件
[ -r file ]
当前用户对该文件是否有读权限
[ -x file ]
当前用户对该文件是否有执行权限
[ -w file]
当前用户对该文件是否有写权限
[ -L|h file ]
当前文件是否是一个链接,等价于-h
2.2 示例
- 示例1
判断文件是否存在
[root@liubei ~]# [ -e /etc/passwd ]
[root@liubei ~]# echo $?
0
[root@liubei ~]# [ -e /etc/hello ]
[root@liubei ~]# echo $?
1
- 示例2
如果目录
/tmp/hello
不存在,则创建文件夹
if [ ! -d "/tmp/hello" ]; then mkdir /tmp/hello; fi
3. 数值比较:
3.1 shell风格
- 比较符号
-eq
等于, -ne
不等于
-lt
小于, -gt
大于
-le
小于等于,-ge
大于等于
- 示例
# [ 100 -gt 20 ]
# echo $?
0
3.2 C语言风格比较
- 语法
((M<N))
两层括号
可以直接用符号链接,不必在意空格
- 示例
[root@liubei ~]# ((100>20))
[root@liubei ~]# echo $?
0
[root@liubei ~]# ((100<20))
[root@liubei ~]# echo $?
1
4. 字串比较
4.1 判断字符串长度是否为0
注意:空值和未定义都为0
- 语法
[ -z $变量 ]
- 示例
判断是否输入用户名
#!/bin/bash
read -p "input name : " user_a
if [ -z $user_a ]
then
echo "null"
else
echo "ok"
fi
4.2 比较两个字串是否相同:
- 语法
[ $变量 = “值” ]
[[ $USER = “root” ]]
支持正则
注意:等号两边必须空格
- 示例
#!/bin/bash
read -p "input name : " user_a
if [ $user_a = "root" ]
then
echo "OK"
else
echo "NO"
fi
输入 root 则输出OK,输入其他用户名则输出NO
- 示例2: [[ ]]支持正则
#!/bin/bash
read -p "input name : " user_a
if [[ $user_a = "root" ]]
then
echo "OK"
else
echo "NO"
fi
输出如下:
[root@liubei tmp]# bash test.sh
input name : rooooot
OK
- 示例3:逻辑运用
输入 root 或 liubei 则输出OK,输入其他用户名则输出NO
#!/bin/bash
read -p "input name : " user_a
if [ $user_a = "root" -o $user_a = "liubei" ]
then
echo "OK"
else
echo "NO"
fi
或
#!/bin/bash
read -p "input name : " user_a
if [ $user_a = "root" ] || [ $user_a = "liubei" ]
then
echo "OK"
else
echo "NO"
fi
5. 是否包含
- 语法
[[ "字串" =~ 要查询字串 ]]
或者
[[ 变量 =~ 要查询字串 ]]
注意:
该判必须是 [[ ]],要查询部分支持正则
- 示例
判断输入的用户是否以
r
开头
#!/bin/bash
read -p "input name : " user_a
if [[ $user_a =~ ^r ]]
then
echo "OK"
else
echo "NO"
fi