shell 判断式

1.利用 test 指令的测试功能

我要检查 /dmtsai 是否存在时

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

执行结果并不会显示任何讯息

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

文件类型判断

  1. -e 档名存在
  2. -f 档名存在,且为文件
  3. -d 档名存在,且为目录
  4. -b 档名存在,且为block device
  5. -c 档名存在,且为character device
  6. -S 档名存在,且为Socket文件
  7. -p 档名存在,且为FIFO(pipe)文件
  8. -L 档名存在,且为连接档

权限判断(root权限有例外)

  1. -r
  2. -w
  3. -x
  4. -u SUID
  5. -g SGID
  6. -k Stick bit
  7. -s 非空白文件

文件间比较(test file1 -nt file2)

  1. -nt 1比2新
  2. -ot 1比2旧
  3. -ef 1与2是否为相同文件,可判断hard link(inode是否相同)

数值判断test n1 -eq n2

  1. eq (equal)
  2. ne (no equal)
  3. gt (greater than)
  4. lt (less than)
  5. ge (greater than or equal)
  6. le (less than or equal)

判断字符串

  1. test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true
  2. test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。
    注: -n 亦可省略
  3. test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true
  4. test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false

多重条件判定

  1. -a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。
  2. -o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。
  3. ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

2.例子

[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. \n\n"
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}"

由于 root 在很多权限的限制上面都是无效的,所以使用 root 执行这个脚本时, 常常会发现与 ls -l 观察到的结果并不相同!

3.利用判断符号 [ ]

举例来说,如果我想要知道 ${HOME} 这个变量是否为空的

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

使用中括号必须要特别注意,因为中括号用在很多地方,包括通配符与正规表示法等等,所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空格符来分隔喔假设我空格键使用『□』符号来表示,那么,在这些地方你都需要有空格键:

[ "$HOME" == "$MAIL"]
["$HOME"=="$MAIL"]
↑        ↑  ↑       ↑

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

中括号的使用方法与 test 几乎一模一样啊~ 只是中括号比较常用在条件
判断式 if … then … fi 的情况中就是了。

[dmtsai@study bin]$ vim ans_yn.sh
#!/bin/bash
# Program:
#
This program shows the user's choice
# History:
# 2015/07/16
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N): " yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0

Guess you like

Origin blog.csdn.net/qq_52835624/article/details/119135597