zoukankan      html  css  js  c++  java
  • Linux Shell脚本编程-基础2

    命令退出状态码
      bash每个命令,执行状态都有返回值
      0表示成功
      非0表示失败(1-255)
      $?特殊变量可以打印出上一条命令的状态返回值

      脚本的状态返回值是脚本执行的最后一条命令
      自定义脚本状态返回值:exit #
      #为0-255的数字(0、1、127、255这几个数字保留系统自身用)

      引用命令的执行回显结果:
      `command`或$(command)
      引用命令执行成功与否的状态结果:
      一定是直接执行命令。通常需要将执行回显结果重定向至/dev/null

      注意:
      脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
      如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

    条件测试
      作用:
      判断某需求是否满足,需要由测试机制来实现
      专用的测试表达式需要由测试命令辅助完成测试过程

     执行命令,利用命令状态返回值来判断
      0:成功
      1-255:失败

     测试表达式方法:
      test 测试表达式   test命令方式的表达式
      [ 测试表达式 ]  注意中括号和表达式前后有空格
      [[ 测试表达式 ]]  做字符串比较时用这种方式,因为有时候采用单中括号会产生错误(支持模式匹配)

      条件性的执行逻辑操作符,根据退出的状态而定,命令有条件的运行    
      && :代表条件性的AND
      || :代表条件性的OR

    bash的测试类型
      整数测试
      -eq 测试两个整数是否相等,不等为假,相等为真;比如[ $A -eq $B ]
      -ne 测试两个整数是否不等,不等为真,相等为假
      -gt 测试一个数是否大于另一个数,大于为真,否则为假
      -lt 测试一个数是否小于另一个数,小于为真,否则为假
      -ge 大于或等于为真,否则为假
      -le 小于或等于为真,否则为假
    演示:
    [root@centos7 ~]# test 2 -eq 3
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# test 2 -ne 3
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# test 2 -gt 3
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# test 2 -lt 3
    [root@centos7 ~]# echo $?
    0

      字符串测试
      双目测试:判断两个字符串
        >   大于(按ASSIC码先后顺序比较)
       <    小于
       ==   等于,判断两个字符串是否相等
       !=或<>  不等于,判断两个字符串是否不相等
       =~   左侧是字符串,右侧是一个匹配模式,判断左侧的字符串能否被右侧的模式所匹配:通常只在[[ ]]中使用模式中可以使用行首、行尾锚定符,但是模式不要加引号(扩展表达式)

      单目测试:判断字符串(变量)是否为空,字符串一定要加双引号
        -n "$stringVar":判断字符串是否不空,不空为真,空则为假
        -z "$stringVar":判断判断字符串是否为空,空则为真,不空则假
    演示:
    [root@centos7 ~]# [ tom == Tom ]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# [ tom == tom ]
    [root@centos7 ~]# echo $?
    0

    # 变量替换要尽量用双引号,如果不用的话,如果变量不存在为空,会报错
    [root@centos7 ~]# [ tom == $name ]
    -bash: [: tom: 期待一元表达式
    [root@centos7 ~]# [ tom == "$name" ]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 bin]# [[ tom == $name ]]
    [root@centos7 bin]# echo $?
    1

    [root@centos7 ~]# name=xiu
    [root@centos7 ~]# [ tom == $name ]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# [ tom == "$name" ]
    [root@centos7 ~]# echo $?
    1

    # 要尽量使用 [[ ]]
    [root@centos7 ~]# [ 'a' > 'b' ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [ 'a' < 'b' ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [[ 'a' > 'b' ]]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# [[ 'a' < 'b' ]]
    [root@centos7 ~]# echo $?
    0

    # 在 [] 中变量替换一定要加双引号,但是在 [[ ]] 中可以不加
    [root@centos7 bin]# [ -z $a ] && echo yes || echo no
    yes
    [root@centos7 bin]# [ -n $a ] && echo yes || echo no
    yes
    [root@centos7 bin]# [ -n "$a" ] && echo yes || echo no
    no
    [root@centos7 bin]# [ -z "$a" ] && echo yes || echo no
    yes
    [root@centos7 bin]# [[ -n $a ]] && echo yes || echo no
    no
    [root@centos7 bin]# [[ -z $a ]] && echo yes || echo no
    yes
    #============================================================================

    [root@centos7 ~]# name=haha
    [root@centos7 ~]# echo $name
    haha
    [root@centos7 ~]# [[ "$name" =~ ha ]]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [[ "$name" =~ h ]]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [[ "$name" =~ hx ]]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# [[ "$name" =~ xx ]]
    [root@centos7 ~]# echo $?
    1

      文件测试
      单目测试:
        判断文件是否存在
        -e FILE 测试文件是否存在
        -a FILE 测试文件是否存在

        判断文件是否存在以及文件类型
       -f FILE 测试是否为普通文件
       -d dirname 测试是否为目录文件
       -b FILE 测试文件是否存在并且是否为一个块设备文件
       -c FILE 测试文件是否存在并且是否为一个字符设备文件
       -h FILE 测试文件是否存在并且是否为符号链接文件
       -L FILE 测试文件是否存在并且是否为符号链接文件
       -p FILE 测试文件是否存在并且是否为管道文件
       -S FILE 测试文件是否存在并且是否为套接字文件

        判断文件权限
       -r FILE 测试其执行用户是否对此文件有读取权限
       -w FILE 测试其执行用户是否对此文件有写权限
       -x FILE 测试其执行用户是否对此文件有执行权限
       在脚本中使用source命令导入配置文件的时候,判断配置文件是否存在,同时判断执行脚本的用户对导入的文件有读权限
       [ -r 配置文件 ] && source 配置文件

        文件特殊权限测试:
        -g FILE 测试文件是否拥有sgid权限
        -u FILE 测试文件是否拥有suid权限
        -k FILE 测试文件是否拥有拥有sticky权限

        判断文件是否有内容
        -s FILE 测试文件是否存在并且不空

        判断文件时间戳
        -N FILE 测试文件从上一次读操作后是否被修改过

       判断从属关系
        -O FILE 当前用户是否为文件的属主
        -G FILE 当前用户是否属于文件的属组

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

      双目测试:
        FILE1 -nt FILE2 测试FILE1是否比FILE2更新一些(修改时间)
        FILE1 -ot FILE2 测试FILE1是否比FILE2更老一些
        FILE1 -ef FILE2 测试FILE1的inode号与FILE2的inode号是否一致,可以理解为两个文件是否为同一个文件,这个判断硬链接是很好的办法

    演示:
    1、文件存在性测试
    [root@centos7 ~]# [ -e /etc/fstab ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [ -e /etc/rc.d/rc.sysinit ]
    [root@centos7 ~]# echo $?
    1

    2、文件存在性及类型测试
    [root@centos7 ~]# [ -b /dev/sda ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [ -b /dev/sdb ]
    [root@centos7 ~]# echo $?
    1
    [root@centos7 ~]# [ -d /etc ]
    [root@centos7 ~]# echo $?
    0

    [root@centos7 ~]# [ -L /etc/redhat-release ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# ll /etc/redhat-release
    lrwxrwxrwx. 1 root root 14 11月 6 18:30 /etc/redhat-release -> centos-release

    3、文件权限及特殊权限测试
    [root@centos7 ~]# ll /etc/shadow
    ---------- 1 root root 1400 2月 20 14:12 /etc/shadow

    [centos@centos7 ~]$ whoami
    centos
    [centos@centos7 ~]$ [ -r /etc/shadow ]
    [centos@centos7 ~]$ echo $?
    1
    [centos@centos7 ~]$ [ -r /etc/passwd ]
    [centos@centos7 ~]$ echo $?
    0
    [centos@centos7 ~]$ [ -w /etc/passwd ]
    [centos@centos7 ~]$ echo $?
    1

    # 对于root用户来讲,rw 权限是以实际为主,但执行权限是起作用的
    [root@centos7 ~]# whoami
    root
    [root@centos7 ~]# [ -r /etc/shadow ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [ -w /etc/shadow ]
    [root@centos7 ~]# echo $?
    0
    [root@centos7 ~]# [ -x /etc/shadow ]
    [root@centos7 ~]# echo $?
    1

    #==========================================================================

    [root@centos7 ~]# [ -u /usr/bin/passwd ]
    [root@centos7 ~]# echo $?
    0
    # 说明 /usr/bin/passwd 拥有suid权限
    [root@centos7 ~]# ll /usr/bin/passwd
    -rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd

    4、文件是否有内容测试
    [root@centos7 ~]# touch /tmp/hello
    [root@centos7 ~]# [ -s /tmp/hello ]
    [root@centos7 ~]# echo $?
    1

    [root@centos7 ~]# [ -s /etc/fstab ]
    [root@centos7 ~]# echo $?
    0

    5、双目测试
    [root@centos7 ~]# touch f1
    # 创建f22 的硬链接为f1
    [root@centos7 ~]# ln f1 f22
    # 是否指向同一设备上相同的inode,也就是说是否为硬链接
    [root@centos7 ~]# [ f1 -ef f22 ]
    [root@centos7 ~]# echo $?
    0

    [root@centos7 ~]# ll -i f1 f22
    201391291 -rw-r--r-- 2 root root 1024 2月 23 18:39 f1
    201391291 -rw-r--r-- 2 root root 1024 2月 23 18:39 f22

      组合条件测试
      第一种方式:逻辑判断符
      逻辑与:&&(两个条件都为真的时候才为真,任何一个为假就为假)
        第一个条件为假时,第二条件不用再判断,最终结果已经为假所以第二条件不执行
        第一个条件为真时,第二条件必须判断;只有第二条件执行才能得最终结果
      逻辑或:||(两个条件其中任何一个为真就为真,同时为假才为假)
        第一个条件为假时,第二条件必须判断,只有第二条件执行才能得最终结果
        第一个条件为真时,第二条件不用再判断,最终结果已经为真所以第二条件不执行

      && 命令1&&命令2 当命令1正确执行,命令2才会执行
        当命令1执行不正确,命令2不会执行
      || 命令1||命令2 当命令1执行不正确时,命令2才会执行
        当命令1正确执行,命令2不会执行

      第二种方式:布尔运算符
        EXPRESSION1 -a EXPRESSION2 逻辑与,判断1和判断2都成立,最终结果为真
        EXPRESSION1 -o EXPRESSION2 逻辑或,判断1和判断2有一个成立,最终结果就为真
        ! EXPRESSION  取反

     示例:
      aa=11
      [ -n “$aa” -a “$aa” -gt 23 ]&& echo yes || echo no
      判断变量aa是否有值,同时判断变量aa是否大于23;因为变量aa的值不大于23,虽然第一个判断为真,但返回的结果为假输出no

      注意:
      布尔运算符(-a、-o、!)只能用在[ ]表达式中;如:[ 1 -eq 1 -a 2 -eq 2 ]为true
      逻辑运算符(&&、||)只能用在` `和(( ))中使用

  • 相关阅读:
    淘宝返回顶部
    混合布局
    css布局使用定位和margin
    选项卡 js操作
    ul li 好友列表
    js添加删除元素
    下拉列表的简单操作
    python笔记
    kali linux 虚拟机网卡未启动
    python 重新安装pip(python2和python3共存以及pip共存)
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9854621.html
Copyright © 2011-2022 走看看