我是靠谱客的博主 美满大米,这篇文章主要介绍判断式1. 判断式,现在分享给大家,希望可以做个参考。

目录

  • 1. 判断式
    • 1.1 利用 test 命令的测试功能
    • 1.2 利用判断符号[ ]
    • 1.3 shell脚本的默认变量($0、$1……)

1. 判断式

1.1 利用 test 命令的测试功能

检测系统上某些文件或相关的属性时,利用【test】命令

test 命令用于检查某个条件是否成立,它可以进行数值字符文件三个方面的测试

用法:

复制代码
1
2
3
4
5
6
7
8
[dmtsai@study ~] test [表达式] -eq (=: 等于则为真 -ne (!=: 不等于则为真 -gt (>: 大于则为真 -ge (>=: 大于等于则为真 -lt (<: 小于则为真 -le (<=: 小于等于则为真

范例:
检查【/dmtsai】是否存在

复制代码
1
2
3
[dmtsai@study ~] test -e /dmtsai #执行结果不会显示任何信息 # -e 是测试一个【东西】在不在

上述命令执行结果不会显示任何信息,可通过【$?】或【&&】及【||】来展现结果

复制代码
1
2
3
[dmtsai@study ~] test -e /dmtsai && echo "exist" || echo "Not exist" Not exist #显示不存在

1.关于某个文件名的【类型判断
例如【test -e filename】表示存在否

复制代码
1
2
[dmtsai@study ~] test -e filename
参数意义
-e该【文件名】是否存在(常用)
-f该【文件名】是否存在且为文件(常用)
-d该【文件名】是否存在且为目录(常用)
-b该【文件名】是否存在且为一个 block device
-c该【文件名】是否存在且为一个 character device
-S该【文件名】是否存在且为一个 socket 文件
-p该【文件名】是否存在且为一个FIFO(pipe)文件
-L该【文件名】是否存在且为一个链接文件

2.关于文件的权限检测
例如【test -r filename】表示可读否(但 root 权限常有例外)

复制代码
1
2
[dmtsai@study ~] test -r filename
参数意义
-r检测该文件名是否存在且具有【可读】权限
-w检测该文件名是否存在且具有【可写】权限
-x检测该文件名是否存在且具有【可执行】权限
-u检测该文件名是否存在且具有【SUID】权限
-g检测该文件名是否存在且具有【SGID】权限
-k检测该文件名是否存在且具有【Sticky bit】权限
-s检测该文件名是否存在且为【非空文件】

3.两个文件之间的比较
例如:

复制代码
1
2
[dmtsai@study ~] test file1 -nt file2
参数意义
-nt(newer than)判断 file1 是否比 file2 新
-ot(older than)判断 file1 是否比 file2 旧
-ef判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上
主要意义在判定两个文件是否均指向同一个 inode

4.关于两个整数之间的判定
例如:

复制代码
1
2
[dmtsai@study ~] test n1 -eq n2
参数意义
-eq两数值相等(equal)
-ne两数值不等(not equal)
-gtn1大于n2(greater than)
-ltn1小于n2(less than)
-gen1大于等于n2(greater than or equal)
-len1小于等于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.多重条件判定
例如:

复制代码
1
2
3
4
5
6
7
[dmtsai@study ~] test -r file -a -x file # file 同时具有 r 【与】 x 权限时,才返回 true [dmtsai@study ~] test -r file -o -x file # file 同时具有 r 【或】 x 权限时,才返回 true [dmtsai@study ~] test ! -x file # file 不具有 x 时,返回 true
参数意义
-a(and)两条件同时成立
-o(or)两条件任何一个成立
!反相状态,不满足条件返回 true

范例:
让用户输入一个文件名,我们判断此文件是否存在

  1. 不存在则给予【Filename does not exist】信息,并中断程序
  2. 存在,则判断它是文件还是目录,结果输出【Filename is regular file】或【Filename is directory】
  3. 判断执行者的身份对此文件或目录所拥有的权限,并输出权限数据

使用vim编辑脚本

复制代码
1
2
[dmtsai@study bin] vim file_perm.sh

运行脚本

复制代码
1
2
[dmtsai@study bin] sh file_perm.sh

1.2 利用判断符号[ ]

范例
查询 ${HOME} 这个变量是否为空

复制代码
1
2
[dmtsai@study ~] [ -z "${HOME}" ] ; echo $?

特别注意:中括号
中括号用在很多地方,包括通配符与正则表达式等
如果在 bash 的语法中使用中括号作为 shell 的判断式,必须要注意中括号的两端要有空格符来分隔

两变量的内容是否相等
本人使用Ubuntu,一个【=】才可正常执行脚本

复制代码
1
2
3
[ "$HOME" == "$MALL" ] #需要空格 [${HOME}==${MALL}] #不需要空格


注意

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

使用中括号比较常用在条件判断式【if…then…fi】情况中
中括号判断的范例,范例设置如下:

  1. 当执行一个程序时,此程序会让用户选择 Y 或 N
  2. 如果用户输入 Y 或 y,就显示【OK,continue】
  3. 如果用户输入 N 或 n,就显示【Oh,interrupt】
  4. 如果不是Y/y/N/n之内的其他字符,就显示【I don’t know whot your choice is】

1.3 shell脚本的默认变量($0、$1……)

脚本针对参数已经设置好一些变量名称,对应如下

复制代码
1
2
3
/path/to/scriptname opt1 opt2 opt3 opt4 # 选项1-4 $0 $1 $2 $3 $4 # 对应变量名称
特殊变量意义
$#代表后接的参数个数
$@代表【"$1""$2""$3""$4"】之意,每个变量是独立的
$*代表【"$1c$2c$3c$4"】c为分隔字符,默认为空格

假设要执行一个可以带参数的脚本,执行该脚本后屏幕会显示如下数据:

  1. 程序的文件名
  2. 参数总个数
  3. 若参数个数小于2,则告知用户参数数量太少
  4. 全部参数的内容
  5. 第一个参数是什么
  6. 第二个参数是什么
复制代码
1
2
[dmtsai@study bin] vim how_paras.sh

复制代码
1
2
[dmtsai@study bin] sh how_paras.sh opt1 opt2 opt3

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

复制代码
1
2
[dmtsai@study bin] sh shift_paras.sh opt1 opt2 opt3 opt4 opt5 opt6


最后

以上就是美满大米最近收集整理的关于判断式1. 判断式的全部内容,更多相关判断式1.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部