Shell 脚本应用 (二)

一. 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 "  命令获得, 以命令替换方式嵌入:

 注释:

  1.            who                                                                        查看用户等登录数量 一行代表一个用户
  2.            who |wc -l                                                              查看此命令有几行
  3.            -gt  5                                                                      是否大于 5
  4.            [  $(who wc-l ) -gt 5  ]                                            查看用户登录数量是否超过五个
  5.           && echo "Too many."                                             屏幕标准输出
  6.            [  $(who wc-l ) -gt 5  ]   && echo "Too many."       查看用户登录数量是否超过五行 超过即标准输出 "Too many." 
  7.                                                                                                                                          不显示即没超出范围
  8.            -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
  1.  脚本声明
  2.  检查是否有 /tmp/scripts 这个目录 没有则创建      注释: -d :检查目录是否存在    !  : 相反意思
  3.  cd  至 /tmp/scripts 目录  (也可以使用 cd 命令路径   /usr/bin/cd )
  4.  将 /etc/pam.d 下的内容 复制到当前目录             注释:  ./  :代表复制到当前目录
  5.  检索 /etc/passwd 目录下有没有 redhat 用户 有与没有的提示信息 将输入到 /dev/null 目录下
  6.  检查上一条命令是否成立 成立则直接递归修改 test 目录的属主为 redhat ;  条件若不成立 则先创建 redhat 用户 再修改属主
  7. 递归修改 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值