• Linux学习-善用判断式


    利用 test 指令的测试功能

    要检测系统上面某些文件或者是相关的属性时,利用 test 这个指令来工作真是好用得不 得了, 举例来说,我要检查 /dmtsai 是否存在时,使用:

    [dmtsai@study ~]$ test -e /dmtsai
    

    执行结果并不会显示任何讯息,但最后我们可以通过 $? 或 && 及 || 来展现整个结果。例如

    [dmtsai@study ~]$ test -e /dmtsai && echo "exist" || echo "Not exist"
    Not exist <==结果显示不存在啊!
    

    -e 是测试一个“东西”在不在,还有哪些标志可以来判断的呢?

    测试的标志 代表意义
    1. 关于某个文件名的“文件类 型”判断,如 test -e filename 表 示存在否
    -e 该“文件名”是否存在?(常用)
    -f 该“文件名”是否存在且为文件(file)?(常用)
    -d 该“文件名”是否存在且为目录(directory)?(常 用)
    -b 该“文件名”是否存在且为一个 block device 设备?
    -c 该“文件名”是否存在且为一个 character device 设 备?
    -S 该“文件名”是否存在且为一个 Socket 文件?
    -p 该“文件名”是否存在且为一个 FIFO (pipe) 文件?
    -L 该“文件名”是否存在且为一个链接文件?
    2. 关于文件的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
    -r 侦测该文件名是否存在且具有“可读”的权限?
    -w 侦测该文件名是否存在且具有“可写”的权限?
    -x 侦测该文件名是否存在且具有“可执行”的权限?
    -u 侦测该文件名是否存在且具有“SUID”的属性?
    -g 侦测该文件名是否存在且具有“SGID”的属性?
    -k 侦测该文件名是否存在且具有“Sticky bit”的属性?
    -s 侦测该文件名是否存在且为“非空白文件”?
    3. 两个文件之间的比较,如: test file1 -nt file2
    -nt (newer than)判断 file1 是否比 file2 新
    -ot (older than)判断 file1 是否比 file2 旧
    -ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定,两个文件是 否均指向同一个 inode 哩!
    4.关于两个整数之间的判定,例 如 test n1 -eq n2
    -eq 两数值相等 (equal)
    -ne 两数值不等 (not equal)
    -gt n1 大于 n2 (greater than)
    -lt n1 小于 n2 (less than)
    -ge n1 大于等于 n2 (greater than or equal)
    -le n1 小于等于 n2 (less than or equal)
    5. 判定字串的数据
    test -z string 判定字串是否为 0 ?若 string 为空字串,则为 true
    test -n string 判定字串是否非为 0 ?若 string 为空字串,则为 false。 -n 亦可省略
    test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true
    test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false
    6. 多重条件判定,例如: test -r filename -a -x filename
    -a and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
    -o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
    ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回 传 true

    首先,判断一下,让使用者输入一个 文件名,我们判断:

    1. 这个文件是否存在,若不存在则给 一个“Filenamedoesnotexist”的讯息,并中断程序;

    2. 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regularfile”或 “Filename is directory”

    3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!

    [dmtsai@study bin]$ vim file_perm.sh
    #!/bin/bash
    # Program:
    #	User input a filename, program will check the flowing:
    #	1.) exist? 2.) file/directory? 3.) file permissions 
    # History:
    # 2015/07/16	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. 让使用者输入文件名,并且判断使用者是否真的有输入字串?
    echo -e "Please input a filename, I will check the filename's type and permission. 
    
    "
    read -p "Input a filename : " filename
    test -z ${filename} && echo "You MUST input a filename." && exit 0
    # 2. 判断文件是否存在?若不存在则显示讯息并结束脚本
    test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
    # 3. 开始判断文件类型与属性
    test -f ${filename} && filetype="regulare file"
    test -d ${filename} && filetype="directory"
    test -r ${filename} && perm="readable"
    test -w ${filename} && perm="${perm} writable"
    test -x ${filename} && perm="${perm} executable"
    # 4. 开始输出信息!
    echo "The filename: ${filename} is a ${filetype}"
    echo "And the permissions for you are : ${perm}"
    

    利用判断符号 [ ]

    我们还可以利用判断符号“ [ ] ”(就是中括号啦) 来 进行数据的判断呢! 举例来说,如果我想要知道 ${HOME} 这个变量是否为空的,可以这样做:

    [dmtsai@study ~]$ [ -z "${HOME}" ] ; echo $?
    

    使用中括号必须要特别注意,因为中括号用在很多地方,包括万用字符与正则表达式等等, 所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字符来分隔。

    所以说,要注意:

    • 在中括号 [] 内的每个元件都需要有空白键来分隔;
    • 在中括号内的变量,最好都以双引号括号起来;
    • 在中括号内的常数,最好都以单或双引号括号起来。

    Shell script 的默认变量($0, $1...)

    script 针对参数已经有设置好一些变量名称了!对应如下:

    /path/to/scriptname  opt1  opt2  opt3  opt4 
           $0             $1    $2    $3    $4
    

    除了这些数字的变量之外, 我们还有一些较为特殊的变量可以在 script 内使用来调用这些参数:

    • $# :代表后接的参数“个数”,以上表为例这里显示为“ 4 ”;

    • $@ :代表“ "$1" "$2" "$3" "$4" ”之意,每个变量是独立的(用双引号括起来);

    • $* :代表“ "$1c$2c$3c$4" ”,其中 c 为分隔字符,默 认为空白键, 所以本例中代表“ "$1 $2 $3 $4" ”之意。

    • shift:造成参数变量号码偏移

    那个 shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前 面的几个参数的意思。

  • 相关阅读:
    Array 对象-sort()
    vue安装
    前端面试题
    JavaScript对象原型
    CSS如何水平垂直居中?
    块格式化上下文(Block Formatting Context,BFC)
    盒子模型
    前端基础
    Markdown语法
    浏览器 滚动条 占据 y轴宽度的解决方案
  • 原文地址:https://www.cnblogs.com/uetucci/p/7799775.html
Copyright © 2020-2023  润新知