一. test 命令
注释: 测试特定的表达式是否成立, 当条件成立时, 测试语句的返回值为 0
当条件不成立时, 则返回其他数值
1.1 Test 命令语法/格式:
格式1:test 条件表达式
格式2:[ 条件表达式 ] (至少应有一个空格)
这两种方式的作用完全相同, 但通常后一种形式更为常用,也更贴近编程习惯.
1.2 文件测试
文件测试是指根据给定的路径名称, 判断指定目标是目录还是文件, 或者判断文件是否可读.可写.可执行等.
文件测试常用操作选项如下,使用时将测试对象放在放在操作选项之后即可!
- -d : 测试是否为目录 (Directory)
- -f : 测试是否问文件 (File)
- -e : 测试目录或文件是否存在 (Exist)
- -r : 测试当前用户是否有读取权限 (Read)
- -w : 测试当前用户是否有写入权限 (Write)
- -x : 测试当前用户是否有执行权限 (Execute)
1.3 示例: 执行条件测试操作以后, 通过预定义变量 $? 可以获得测试命令的返回状态值, 从而判断该条件是否成立 例如: 执行以下操作可测试目录 /media/ 是否存在, 如果返回值 $? 为 0 ,表示存在该目录,否则表示不存在 or 虽然存在但不是目录
若测试的条件不成立,则测试的返回值将不为 0 (通常为 1 ) . 例如, 以下操作展示了测试不存在目录的情况:
通过查看变量 echo $? 的值可以判断前一步的条件测试结果, 但是操作比较繁琐,输出结果不是很直观, 为了更直观的查看测试结果,可以结合命令分隔符 "&&" 和 "echo" 命令一起用, 当条件成立时直接输出 "YES". 其中, "&&" 符号表示而且的关系, 只有当前面的命令执行成功后才会执行后面的命令, 否侧后面的命令将会被忽略, 上述目录测试操作可以改写为如下所示的命令:
注意字符之间空格!!!
2.整数值比较
理论:整数值比较是指根据给定的两个数值,判断第一个数与第二个数的关系,如第一个数是否大于.等于.小于第二个数. 整数值比较的常用选项如下, 使用时将操作选项放在要比较的两个整数之间.
- -gt : 大于 (Greater Than)
- -lt : 小于 (lesser Than)
- -eq: 等于 (Equal)
- -ne: 不等于 (Not Equal)
- -ge: 大于或等于 (Geater Than or Equal)
- -le: 小于或等于 (lesser Than or Equal)
2.1 示例: 整数值比较在 Shell 脚本编写中的应用较多, 如判断一登录数量.开启进程数,磁盘使用率是否超标.
执行以下操作可判断当前已登录的用户数, 当超过 5 个时输出 "Too many." 其中,已登录用户数可通过 " wc -l " 命令获得, 以命令替换方式嵌入:
注释:
- who 查看用户等登录数量 一行代表一个用户
- who |wc -l 查看此命令有几行
- -gt 5 是否大于 5
- [ $(who wc-l ) -gt 5 ] 查看用户登录数量是否超过五个
- && echo "Too many." 屏幕标准输出
- [ $(who wc-l ) -gt 5 ] && echo "Too many." 查看用户登录数量是否超过五行 超过即标准输出 "Too many."
- 不显示即没超出范围
- -ge 大于或等于
示例2 :执行以下操作可以判断物理内存 (Mem) 当前的磁盘缓存 (buff/cache) 大小 低于 1024 MB 是输出具体数值:
3. 字符串比较.
字符串比较通常用来检查用户输入.系统环境是否满足条件,在提供交互式操作的 Shell 脚本中,也可以用来判断用户输入的位置参数是否符合要求,常用的操作选项如下:
- =: 第一个字符与第二个字符内容相同
- !=: 第一个字符串与第二个字符串不相同, 其中 " ! " 表示取反
- -z: 检查字符是否为空,对于未定义的或赋予空值大的变量将视为空串
执行以下操作,判断当前系统的语言环境,当发现不是 " en.US" 时 输出提示信息 " Not en.US "
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
当 Shell 脚本应用中, 经常需要用户输入 "yes" or "no" 来确认某个任务 以下操作展示了确认交互的简单过程:
[root@localhost ~]# read -p “是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
4. 逻辑测试
逻辑测试是指判断两个或多个条件之间的依赖关系, 当系统任务取决于多个不同的条件时, 根据这些条件判断是否让同时成立或只要其中一个成立等情况, 需要一个测试过程, 常用的逻辑测试操作选项如下,使用时放在不同的测试语句或命令之间.
- && : 逻辑与 表示 "而且" . 只有当前后两个条件都成立时 整个测试命令的返回值才为 0 (结果 成立) . 使用 test 命令测试时 " && " 可以改为 " -a "
- || : 逻辑或 表示 "或者" . 只要前后两个条件中有一个条件成立 整个测试命令的返回值即为 0 (结果成立) 使用 test 命令测试时 "||" 可以改为 " -o "
- ! : 逻辑否 表示 "不" 只有当指定的条件不成立时 整个测试命令的返回值才会为 0 (结果成立)
测试当前用户名称:
[root@localhost ~]# echo $USER
root
查看当前用户是否跟 teacher 不一样 不一样则向屏幕标准输出 "Not teacher"
[root@localhost ~]# [ $USER != "teacher" ] && echo "Not teacher"
Not teacher
测试/opt/backup目录是否存在:
[root@localhost ~]# [ -d /media/cdrom ] && echo "YES" || echo "NO“
NO
案例
效果:编辑一个安装 系统服务脚本 用来判断软件是否安装 如果已安装输出"此软件已安装", 如果未 安装则进行安装!
[root@localhost ~]# vim rpm_install.sh
#!/bin/bash //脚本声明
rpm -q $1 &> /dev/null //查看rpm软件是否已安装 无论安装与未安装的提示信息将混合输出到 /dev/null 目录下
[ $? -eq 0 ] && echo "$1 软件已安装" || yum -y install $1 &> /dev/null //检测上一条条件表达式是否成立 成立则输出结果 不成立则进行安装
给该脚本添加执行权限 并使用;
案例二
效果:写一个脚本 再使用 if 语句进行改造
实验步骤:
1.创建目录/tmp/scripts
2.切换工作目录至此目录中
3.复制/etc/pam.d目录至当前目录,并重命名为test
4.将当前目录的test及其里面的文件和子目录的属主改为redhat
5.将test及其子目录中的文件的其它用户的权限改为没有任何权限
#!/bin/bash
[ ! -d /tmp/scripts ] && mkdir /tmp/scripts
cd /tmp/scripts
cp -fr /etc/pam.d ./test
grep "redhat" /etc/passwd &>/dev/null
[ $? -eq 0 ] && chown -R redhat ./test || useradd redhat;chown -R redhat ./test
chmod -R o-rwx ./test
- 脚本声明
- 检查是否有 /tmp/scripts 这个目录 没有则创建 注释: -d :检查目录是否存在 ! : 相反意思
- cd 至 /tmp/scripts 目录 (也可以使用 cd 命令路径 /usr/bin/cd )
- 将 /etc/pam.d 下的内容 复制到当前目录 注释: ./ :代表复制到当前目录
- 检索 /etc/passwd 目录下有没有 redhat 用户 有与没有的提示信息 将输入到 /dev/null 目录下
- 检查上一条命令是否成立 成立则直接递归修改 test 目录的属主为 redhat ; 条件若不成立 则先创建 redhat 用户 再修改属主
- 递归修改 test 目录其他人没有任何权限
使用 if 语句进行改造:
#!/bin/bash
if [ ! -d /tmp/scripts ]; then
mkdir /tmp/scripts
fi
/usr/bin/cd /tmp/scripts
cp -fr /etc/pam.d ./test
grep "redhat" /etc/passwd &>/dev/null
if [ $? -eq 0 ]
then
chown -R redhat ./test
else
useradd redhat
chown -R redhat ./test
fi
chmod -R o-rwx ./test
if 语句结构
if 语句分为三种
1. 单分支 if 语句
if 语句的 "分支" 是指不同测试结果所对应的执行语句 (一条 or 多条 ) 对于但分支的选择结构,只有在 "条件成立" 时才会执行相应的代码 否则不执行任何操作 格式如下:
if 条件测试操作
then
命令序列
fi
2. 双分支 if 语句
对于双分支的选择结构,要求针对 "条件成立" 和 "条件不成立" 两种情况分别执行不同的操作,双分支语句格式:
if 条件测试操作
then
命令序列1
else
命令序列2
fi
3. 多分支 if 语句
由于 if 语句可以根据测试结果的成立. 不成立分别执行操作,所以能够嵌套使用,进行多次判断.例如,首先判断某学生的得分是否及格,若及格则再次判断是否高于90分等, 多分支 if 语句的语法格式如下:
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi