Shell脚本判断、if语句

1、条件测试类型

整数测试

字符测试

文件测试

2、条件测试的表达式

  • 条件表达式

  • \[ 条件表达式 \]

  • test 条件表达式
示例:
Matlab 复制代码
[root@node1 ~]# test -e file && echo true || echo false        # 测试是否又file这个文件
false 
[root@node1 ~]# touch file                                     # 创建一个file文件
[root@node1 ~]# test -e file && echo true || echo false        # 此时返回结果true
true
[root@node1 ~]# [ -e file ] && echo true || echo false
true
[root@node1 ~]# [[ -e file1 ]] && echo true || echo false
false

3、整数测试

  • -eq //测试两个整数是否相等
  • -ne //测试两个整数是否不等
  • -gt //测试一个数是否大于另一个数
  • -lt //测试一个数是否小于另一个数
  • -ge //大于或等于
  • -le //小于或等于
示例:
Matlab 复制代码
[root@node1 ~]# cat b.sh 
#!/bin/bash
a=10
b=8
[ $a -eq $b ]
echo $?
[root@node1 ~]# ./b.sh 
1

案例一

判断是否是两个参数,如果不是两个参数,则显示"必须输入两个参数",如果输入的是两个参数,则继续运行脚本;判断是否为整数,如果输入的不是整数,则显示"输入的参数必须是整数",如果输入的整数,则继续执行脚本;比较大小,分为三个阶段:大于、等于、小于。

第一种:传递参数
Matlab 复制代码
[root@node1 ~]# vim c.sh 
#!/bin/bash
[ $# -ne 2 ]&&{
        echo '必须输入两个参数'
        exit
}
expr $1 + $2 >/dev/null 2>&1
[ $? -ne 0 ]&&{
        echo '输入的参数必须是整数'
        exit
}
[ $1 -gt $2 ]&&{
        echo "$1大于$2"
}
[ $1 -eq $2 ]&&{
        echo "$1等于$2"
}
[ $1 -lt $2 ]&&{
        echo "$1小于$2"
}

# 测试
[root@node1 ~]# chmod +x c.sh         # 设置执行权限 
[root@node1 ~]# ./c.sh 10 20
10小于20
[root@node1 ~]# ./c.sh 20 10
20大于10
[root@node1 ~]# ./c.sh 30 30
30等于30
[root@node1 ~]# ./c.sh                # 不输入参数时
必须输入两个参数
[root@node1 ~]# ./c.sh 6.6 9.9        # 输入的不是整数的时
输入的参数必须是整数

0--标准输入 1--标准输出 2--错误输出

>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到文件中。

第二种:通过read
Matlab 复制代码
[root@node1 ~]# vim r.sh 
read -p '请输入要比较的两个参数:' a b
expr $a + $b >/dev/null 2>&1
[ $? -ne 0 ]&&{
        echo '输入的参数必须是整数'
        exit
}
[ $a -gt $b ]&&{
        echo "$a大于$b
}
[ $a -eq $b ]&&{
        echo "$a等于$b"
}
[ $a -lt $b ]&&{
        echo "$a小于$b"
}

# 测试
[root@node1 ~]# chmod +x r.sh 
[root@node1 ~]# ./r.sh 
请输入要比较的两个参数:20 10
20大于10
[root@node1 ~]# ./r.sh 
请输入要比较的两个参数:10 20
10小于20

案例二

Matlab 复制代码
[root@node1 ~]# vim e.sh
#!/bin/bash
echo "打印菜单,按照选择项选择你喜欢的明星"
cat <<EOF
   1.刘亦菲
   2.彭于晏
   3.蔡徐坤
EOF
read -p "please input the num you like: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{
            [ $num -eq 1 ]&&{
                echo 'I guess you like 刘亦菲'
                exit 0
            }
            [ $num -eq 2 ]&&{
                echo 'I guess you like 彭于晏'
                exit 0
            }
            [ $num -eq 3 ]&&{
                echo 'I guess you like 蔡徐坤'
                exit 0
            }
}||{
            echo 'I guess you are not geam!'
            exit 2
}

# 测试
[root@node1 ~]# ./e.sh 
打印菜单,按照选择项选择你喜欢的明星
   1.刘亦菲
   2.彭于晏
   3.蔡徐坤
please input the num you like: 1
I guess you like 刘亦菲
[root@node1 ~]# ./e.sh 
打印菜单,按照选择项选择你喜欢的明星
   1.刘亦菲
   2.彭于晏
   3.蔡徐坤
please input the num you like: 2
I guess you like 彭于晏
[root@node1 ~]# ./e.sh 
打印菜单,按照选择项选择你喜欢的明星
   1.刘亦菲
   2.彭于晏
   3.蔡徐坤
please input the num you like: 4
I guess you are not geam!

4、字符测试

== # 等值比较,检查==两边的内容是否一致,==两边都要有空格

!= # 检查两边内容是否不一致,不一致为真,一致为假

-z "string" # 测试指定字符串是否为空,空则为真,不空则为假

-n "string" # 测试指定字符串是否不空,不空则为真,空则为假

错误示范:

test "a"="b"

#!/bin/bash

a="run"

b="time"

test "a" = "b"

echo $?

5、文件测试

存在性测试:

-e //测试文件是否存在

存在性及类别测试:

-b //测试文件是否为块设备文件

-c //测试文件是否为字符设备文件

-f //测试文件是否为普通文件

-d //测试指定路径是否为目录

-L //测试文件是否为符号链接文件

-p //测试文件是否为命名管道文件

-S //测试文件是否为套接字文件

文件权限测试:

-r //测试当前用户对指定文件是否有读权限

-w //测试当前用户对指定文件是否有写权限

-x //测试当前用户对指定文件是否有执行权限

文件特殊权限测试:

-g //测试文件是否有sgid权限

-u //测试文件是否有suid权限

-k //测试文件是否有sticky权限

文件大小测试:

-s //测试文件是否非空

文件是否打开测试:

-t fd //fd表示的文件描述符是否已经打开且与某终端相关

双目测试:

file1 -ef file2 //测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件

file1 -nt file2 //测试file1是否比file2新

file1 -ot file2 //测试file1是否比file2旧

无分类:

-N //测试文件自从上一次被读取之后是否被修改过

-O //测试文件是否存在并且被当前用户拥有

-G //测试文件是否存在并且默认组是否为当前用户组

示例:
Matlab 复制代码
# 创建需要测试需要的文件目录
[root@node1 ~]# touch /tmp/file1
[root@node1 ~]# touch /tmp/file2
[root@node1 ~]# mkdir /tmp/dir1
[root@node1 ~]# ln  -s  /tmp/dir1  /tmp/dir2
[root@node1 ~]# mkdir /tmp/dir3
[root@node1 ~]# chmod g+s /tmp/dir3
 
[root@node1 ~]# vim cc.sh
[root@node1 ~]# cat cc.sh 
#!/bin/bash
a=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4
[ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在"
[ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在"
[ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1这是一个目录"||echo "dir1不是一个目录"
[ -L $d ]&&echo "dir2这是一个链接文件"||echo "dir2不是一个链接文件"
[ -g $e ]&&echo "dir3这个具有SGID权限"||echo "dir3不具有SGID权限"

[root@node1 ~]# chmod +x cc.sh
[root@node1 ~]# ./cc.sh 
file1文件已存在
file4文件不存在
file2这是一个普通文件
dir1这是一个目录
dir2这是一个链接文件
dir3这个具有SGID权限

6、组合测试

-a //与关系 &&

-o //或关系 ||

! //非关系 !=

$# -gt 1 -a $# -le 3 \] # 两个都是大于1且小于等于3 \[ $# -gt 1 \] \&\& \[ $# -le 3

1 -eq 1 -a 1 -ne 0

1 -eq 1 \] \&\& \[ 1 -ne 0

1 -eq 1 -o 1 -ne 1

1 -eq 1 \] \|\| \[ 1 -ne 1

root@server \~\]# \[ 1 -eq 0 \] \&\& echo true \|\| echo false false \[root@server \~\]# \[ 1 -eq 1 \] \&\& echo true \|\| echo false true

if 语句

1、单分支if语句

语法:

if 条件;then

执行的命令

fi

案例:

判断当前用户是不是root,如果不是那么返回"ERROR: need to be root so that!"

Matlab 复制代码
# 此时是普通用户
[hyh@node1 ~]$ ls
[hyh@node1 ~]$ vim ee.sh
#!/bin/bash
if [ $USER != "root" ];then
        echo "ERROR: need to be root so that!"
fi
 
[hyh@node1 ~]$ chmod +x ee.sh 
[hyh@node1 ~]$ ./ee.sh 
ERROR: need to be root so that!
2、双分支if

语法:

if 条件;then

执行的命令1

else

执行的命令2

fi

案例:

判断当前登录用户是管理员还是普通用户,如果是管理员输出"hey admin"如果是普通用户输出"hey guest"

Matlab 复制代码
[root@node1 ~]# vim f.sh
#!/bin/bash
if [ $USER = "root" ];then
	echo "hey admin"
else
	echo "hey guest"
fi
 
[root@node1 ~]# chmod +x f.sh 
[root@node1 ~]# ./f.sh 
hey admin
3、多分支if语法

if 条件1;then

执行命令1

elif 条件2;then

执行命令2

elif 条件3;then

执行命令3

else

执行命令3

fi

前面案例使用if判断做

Matlab 复制代码
[root@node1 ~]# vim g.sh  
#!/bin/bash
read -p '请输入要比较的两个参数:' a b
expr $a + $b >/dev/null 2>&1
[ $? -ne 0 ]&&{
        echo '输入的参数必须是整数'
        exit
}
if [ $a -gt $b ];then
        echo "$a大于$b"
elif [ $a -eq $b ];then
        echo "$a等于$b"
else
        echo "$a小于$b"
fi
 
[root@node1 ~]# ./g.sh 
请输入要比较的两个参数:10 20
10小于20
[root@node1 ~]# ./g.sh 
请输入要比较的两个参数:1.5 2
输入的参数必须是整数
相关推荐
Thomas_YXQ19 分钟前
Unity3D Overdraw性能优化详解
开发语言·人工智能·性能优化·unity3d
sz66cm21 分钟前
Linux基础 -- 用户态Generic Netlink库高性能接收与回调框架
linux
lanbing25 分钟前
PHP 与 面向对象编程(OOP)
开发语言·php·面向对象
yzx99101326 分钟前
Gensim 是一个专为 Python 设计的开源库
开发语言·python·开源
数巨小码人29 分钟前
Linux常见命令
大数据·linux·运维·服务器·elasticsearch·搜索引擎
麻雀无能为力44 分钟前
python自学笔记2 数据类型
开发语言·笔记·python
邪恶的贝利亚1 小时前
定时器设计
java·linux·前端
招风的黑耳1 小时前
Java集合框架详解与使用场景示例
java·开发语言
xrkhy1 小时前
java中XML的使用
xml·java·开发语言
抽风的雨6101 小时前
【python基础知识】Day 27 函数专题2:装饰器
开发语言·python