test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。
test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。
Shell test 命令的用法为:
test Expression
当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
test 命令也可以简写为,它的用法为:
[ expression ]
注意和
expression
之间的空格,这两个空格是必须的,否则会导致语法错误。的写法更加简洁,比 test 使用频率高。在《Shell if else》中,我们使用 (()) 进行数值比较,这节我们就来看一下如何使用 test 命令进行数值比较。
#!/bin/bashread ageif test $age -le 2; thenecho "婴儿"elif test $age -ge 3 && test $age -le 8; thenecho "幼儿"elif [ $age -ge 9 ] && [ $age -le 17 ]; thenecho "少年"elif [ $age -ge 18 ] && [ $age -le 25 ]; thenecho "成年"elif test $age -ge 26 && test $age -le 40; thenecho "青年"elif test $age -ge 41 && [ $age -le 60 ]; thenecho "中年"elseecho "老年"fi
其中,选项表示小于等于,选项表示大于等于,是逻辑与运算符。
学习 test 命令,重点是学习它的各种选项,下面我们就逐一讲解。
1) 与文件检测相关的 test 选项
文件类型判断 | |
---|---|
选 项 | 作 用 |
-b filename | 判断文件是否存在,并且是否为块设备文件。 |
-c filename | 判断文件是否存在,并且是否为字符设备文件。 |
-d filename | 判断文件是否存在,并且是否为目录文件。 |
-e filename | 判断文件是否存在。 |
-f filename | 判断文件是否存在,井且是否为普通文件。 |
-L filename | 判断文件是否存在,并且是否为符号链接文件。 |
-pfilename | 判断文件是否存在,并且是否为管道文件。 |
-s filename | 判断文件是否存在,并且是否为非空。 |
-S filename | 判断该文件是否存在,并且是否为套接字文件。 |
文件权限判断 | |
选 项 | 作用 |
-r filename | 判断文件是否存在,并且是否拥有读权限。 |
-w filename | 判断文件是否存在,并且是否拥有写权限。 |
-x filename | 判断文件是否存在,并且是否拥有执行权限。 |
-u filename | 判断文件是否存在,并且是否拥有 SUID 权限。 |
-g filename | 判断文件是否存在,并且是否拥有 SGID 权限。 |
-k filename | 判断该文件是否存在,并且是否拥有 SBIT 权限。 |
文件比较 | |
选 项 | 作用 |
filename1 -nt filename2 | 判断 filename1 的修改时间是否比 filename2 的新。 |
filename -ot filename2 | 判断 filename1 的修改时间是否比 filename2 的旧。 |
filename1 -ef filename2 | 判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
Shell test 文件检测举例:
#!/bin/bashread filenameread urlif test -w $filename && test -n $urlthenecho $url > $filenameecho "写入成功"elseecho "写入失败"fi
在 Shell 脚本文件所在的目录新建一个文本文件并命名为 urls.TXT,然后运行 Shell 脚本,运行结果为:
写入成功
2) 与数值比较相关的 test 选项
选 项 | 作用 |
---|---|
num1 -eq num2 | 判断 num1 是否和 num2 相等。 |
num1 -ne num2 | 判断 num1 是否和 num2 不相等。 |
num1 -gt num2 | 判断 num1 是否大于 num2 。 |
num1 -lt num2 | 判断 num1 是否小于 num2。 |
num1 -ge num2 | 判断 num1 是否大于等于 num2。 |
num1 -le num2 | 判断 num1 是否小于等于 num2。 |
注意,test 只能用来比较整数,小数相关的比较还得依赖 bc 命令。
Shell test 数值比较举例:
#!/bin/bashread a bif test $a -eq $bthenecho "两个数相等"elseecho "两个数不相等"fi
运行结果1:
两个数相等
运行结果2:
两个数不相等
3) 与字符串判断相关的 test 选项
选 项 | 作用 |
---|---|
判断字符串 str 是否为空。 | |
判断宇符串 str 是否为非空。 | |
str1 = str2str1 == str2 | 和是等价的,都用来判断 str1 是否和 str2 相等。 |
str1 != str2 | 判断 str1 是否和 str2 不相等。 |
str1 \> str2 | 判断 str1 是否大于 str2。是的转义字符,这样写是为了防止被误认为成重定向运算符。 |
str1 \< str2 | 判断 str1 是否小于 str2。同样,也是转义字符。 |
有C语言、C++、Python、Java 等编程经验的读者请注意,==、>、< 在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串,不能比较数字,这是非常奇葩的,大家要习惯。
其次,不管是比较数字还是字符串,Shell 都不支持 >= 和 <= 运算符,切记。
Shell test 字符串比较举例:
#!/bin/bashread str1read str2#检测字符串是否为空if [ -z "$str1" ] || [ -z "$str2" ]thenecho "字符串不能为空"exit 0fi#比较字符串if [ $str1 = $str2 ]thenecho "两个字符串相等"elseecho "两个字符串不相等"fi
运行结果:
两个字符串不相等
细心的读者可能已经注意到,变量 $str1 和 $str2 都被双引号包围起来,这样做是为了防止 $str1 或者 $str2 是空字符串时出现错误,本文的后续部分将为你分析具体原因。
4) 与逻辑运算相关的 test 选项
选 项 | 作用 |
---|---|
expression1 -a expression | 逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。 |
expression1 -o expression2 | 逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。 |
!expression | 逻辑非,对 expression 进行取反。 |
改写上面的代码,使用逻辑运算选项:
#!/bin/bashread str1read str2#检测字符串是否为空if [ -z "$str1" -o -z "$str2" ]#使用 -o 选项取代之前的 ||thenecho "字符串不能为空"exit 0fi#比较字符串if [ $str1 = $str2 ]thenecho "两个字符串相等"elseecho "两个字符串不相等"fi
前面的代码我们使用两个命令,并使用运算符将它们连接起来,这里我们改成选项,只使用一个命令就可以了。
在 test 中使用变量建议用双引号包围起来
test 和 [] 都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,例如C语言程序的入口函数是 main(),运行C语言程序就从 main() 函数开始,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可。
有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。
假设 test 命令对应的函数是 func(),使用
test -z $str1
命令时,会先将变量 $str1 替换成字符串:
如果我们给 $str1 变量加上双引号,当 $str1 是空字符串时,
test -z "$str1"
就会被替换为,调用 func() 函数的形式就是
func("-z \"\"")
,很显然,选项后面跟的是一个空字符串(表示转义字符),这样 func() 在分析时就不会出错了。
所以,当你在 test 命令中使用变量时,我强烈建议将变量用双引号包围起来,这样能避免变量为空值时导致的很多奇葩问题。
总结
test 命令比较奇葩,>、<、== 只能用来比较字符串,不能用来比较数字,比较数字需要使用 -eq、-gt 等选项;不管是比较字符串还是数字,test 都不支持 >= 和 <=。有经验的程序员需要慢慢习惯 test 命令的这些奇葩用法。
对于整型数字的比较,我建议大家使用 (()),这在《Shell if else》中已经进行了演示。(()) 支持各种运算符,写法也符合数学规则,用起来更加方便,何乐而不为呢?
几乎完全兼容 test ,并且比 test 更加强大,比 test 更加灵活的是;不是命令,而是 Shell 关键字,下节《Shell [[]]》我们将会讲解。
两台笔记本,一台是网线连接,一台没有网线连接(无无线网卡),如何让没有网线的笔记本连接有网线的笔记本共享上网?
买个USB无线网卡。 插在有线上网的本本上。 然后把这个无线网卡设置成基站模式。 另一个笔记本就可以通过网线网卡连接上网了。
电脑文件目录损坏怎么办
当卸载软件时,我们常常会遇到这样的事情:有些程序非常顽固,即使你用了各种招数都无法卸载,这是因为该程序没有完全安装、程序文件被破坏,或者程序安装目录已被删除等原因,为此,你可以用Windows XP附带的、来彻底卸载。 首先要打开Windows XP安装光盘,安装“Support Tools”,然后进入硬盘的Support Tools安装目录(X:Program FilesSupport Tools),找到并双击,于是就会弹出一个“Windows Installer Clean Up”窗口,显示当前已安装的所有程序列表。 你从中选择顽固程序,然后单击“Rmove”按钮即可卸载。 如果以上方法无效,建议你用来卸载,方法是:打开注册表编辑器,定位到HKEY_LOCAL_MacHINESoftwareMicrosoftWindowsCurrentVersionUninstall,在左边项中找到顽固程序的标识(例如),然后依次选择“开始→程序→Windows Support Tools→Command Prompt”命令,在命令提示符后,输入以下命令:msizap T ,按回车后即可卸载顽固程序。
我的电脑没有NVIDIA控制面板这个功能可以去下载吗?求高手指点最好有网站和截图越详细越好谢谢 给分
那是显卡驱动自带的设置程序,如果正确安装驱动都会自动产生的。 ①如果正确安装,在【运行】中输入:regsvr32 回车即可。 ②正确安装驱动该选项就在→控制面板(Windows7在外观和个性化)→NVIEW Desktop Manager←点击就出来。 ③也许是安装系统时候使用了自动安装驱动,而这个驱动程序缺少控制中心所致。 ④已经将下载网址打到Hi之中,请查收。 如果此讯息对您有帮助,请点击【采纳】按钮,此谢。
发表评论