在Linux系统中,并没有名为“bool”的独立命令,但“bool”通常指代布尔逻辑(Boolean Logic)的测试与判断,这一功能主要通过内置的test
命令及其别名[
、[[
实现。test
命令是Shell脚本中进行条件判断的核心工具,通过测试表达式返回真(0)或假(非0),配合if
、while
等控制结构实现逻辑分支,本文将详细解析test
命令的使用方法,涵盖文件测试、字符串测试、数值比较及逻辑组合等场景。
test
命令的基本语法
test
命令的基本语法有两种形式:
test expression
[ expression ]
([
是test
的别名,需与表达式两侧保留空格)[[ expression ]]
(bash扩展语法,支持更多特性,如模式匹配和逻辑运算符&&
、)
执行结果:若表达式成立,返回退出状态码0
(真);否则返回非0
(假)。
[ 1 -eq 1 ] && echo "真" || echo "假" # 输出“真” [ "hello" = "world" ] && echo "真" || echo "假" # 输出“假”
文件状态测试
test
命令常用于测试文件或目录的状态,如是否存在、类型、权限等,以下是常用文件测试操作符及示例:
操作符 | 含义 | 示例 | 说明 |
---|---|---|---|
-e |
文件/目录是否存在 | [ -e /etc/passwd ] |
测试/etc/passwd 文件是否存在 |
-f |
是否为普通文件 | [ -f /etc/passwd ] |
测试是否为普通文件(非目录、设备等) |
-d |
是否为目录 | [ -d /tmp ] |
测试/tmp 是否为目录 |
-L |
是否为符号链接 | [ -L /bin/sh ] |
测试/bin/sh 是否为符号链接 |
-r |
当前用户是否有读权限 | [ -r /etc/passwd ] |
测试当前用户是否有读取权限 |
-w |
当前用户是否有写权限 | [ -w /tmp/test.txt ] |
测试当前用户是否有写入权限 |
-x |
当前用户是否有执行权限 | [ -x /usr/bin/ls ] |
测试当前用户是否有执行权限 |
-s |
文件是否非空(size>0) | [ -s /var/log/syslog ] |
测试文件大小是否大于0字节 |
-nt |
文件A是否比文件B新 | [ file1.txt -nt file2.txt ] |
比较修改时间,file1.txt 的修改时间是否晚于file2.txt |
-ot |
文件A是否比文件B旧 | [ file1.txt -ot file2.txt ] |
比较修改时间,file1.txt 的修改时间是否早于file2.txt |
示例脚本:检查文件是否存在并输出权限信息
#!/bin/bash file="/etc/hosts" if [ -e "$file" ]; then echo "文件 $file 存在" if [ -r "$file" ]; then echo "可读" fi if [ -w "$file" ]; then echo "可写" fi if [ -x "$file" ]; then echo "可执行" else echo "不可执行" fi else echo "文件 $file 不存在" fi
字符串测试
字符串测试用于判断字符串是否为空、是否相等、长度等,操作符需注意与数值比较的区别:
操作符 | 含义 | 示例 | 说明 |
---|---|---|---|
字符串是否相等 | [ "$str1" = "$str2" ] |
注意:两侧需有空格,变量建议加引号避免空值导致语法错误 | |
字符串是否不相等 | [ "$str1" != "$str2" ] |
与相反 | |
-z |
字符串是否为空(长度为0) | [ -z "$str" ] |
测试字符串是否为空 |
-n |
字符串是否非空(长度>0) | [ -n "$str" ] |
测试字符串是否非空 |
示例:判断用户输入是否为空
#!/bin/bash read -p "请输入内容: " input if [ -z "$input" ]; then echo "输入不能为空!" else echo "输入内容: $input" fi
数值比较
数值比较仅支持整数,浮点数需借助bc
等工具,操作符如下:
操作符 | 含义 | 示例 | 说明 |
---|---|---|---|
-eq |
等于(equal) | [ $num1 -eq $num2 ] |
数值相等返回真 |
-ne |
不等于(not equal) | [ $num1 -ne $num2 ] |
数值不等返回真 |
-gt |
大于(greater than) | [ $num1 -gt $num2 ] |
$num1 大于$num2 返回真 |
-ge |
大于等于(greater or equal) | [ $num1 -ge $num2 ] |
$num1 大于等于$num2 返回真 |
-lt |
小于(less than) | [ $num1 -lt $num2 ] |
$num1 小于$num2 返回真 |
-le |
小于等于(less or equal) | [ $num1 -le $num2 ] |
$num1 小于等于$num2 返回真 |
注意:数值比较不能使用或>
,这些是字符串操作符。[ 10 -gt 5 ]
正确,[ 10 > 5 ]
错误(>
会被Shell重定向)。
示例:比较两个数字大小
#!/bin/bash read -p "请输入第一个数字: " a read -p "请输入第二个数字: " b if [ "$a" -gt "$b" ]; then echo "$a 大于 $b" elif [ "$a" -eq "$b" ]; then echo "$a 等于 $b" else echo "$a 小于 $b" fi
逻辑组合测试
复杂逻辑可通过逻辑操作符组合多个表达式,test
命令和[[
支持的逻辑操作符不同:
test
和[
的逻辑操作符
操作符 | 含义 | 示例 | 说明 |
---|---|---|---|
-a |
逻辑与(AND) | [ -f file.txt -a -r file.txt ] |
两个条件同时成立返回真(注意:-a 优先级较高,建议用&& 替代) |
-o |
逻辑或(OR) | [ -d dir -o -x file ] |
任意一个条件成立返回真(建议用替代) |
逻辑非 | [ ! -e file.txt ] |
取反,文件不存在返回真 |
[[
的逻辑操作符(bash推荐)
[[
支持更直观的&&
、、,且支持模式匹配和字符串操作,优先级更合理:
[[ -f file.txt && -r file.txt ]] # 文件存在且可读 [[ "$str" == "hello" || "$str" == "world" ]] # 字符串为hello或world
示例:判断文件是否存在且可读,或目录存在
#!/bin/bash file="/etc/passwd" dir="/tmp" if [[ -f "$file" && -r "$file" ]] || [ -d "$dir" ]; then echo "满足条件:文件存在且可读,或目录存在" else echo "条件不满足" fi
常见注意事项
- 空格问题:
[
和]
必须与表达式保留空格,如[ -f file ]
正确,[-f file]
错误。 - 变量引用:变量建议加双引号,如
[ "$var" = "test" ]
,避免变量为空时语法错误(如[ = test ]
报错)。 test
与[[
区别:[[
是bash扩展,功能更强(如支持正则表达式),而test
是POSIX标准,兼容性更好。- 数值与字符串区分:
[ 10 = 5 ]
返回真(字符串比较),[ 10 -eq 5 ]
返回假(数值比较)。
相关问答FAQs
Q1:test
命令、[
和[[
有什么区别?应该如何选择?
A:test
是内置命令,[
是其别名,两者功能相同,遵循POSIX标准,兼容性最好(如sh、dash)。[[
是bash的扩展语法,支持更多特性(如&&
、、正则匹配、字符串操作无需引号),但仅在bash/ksh等Shell中可用,选择建议:需兼容性时用test
或[
,bash脚本中优先用[[
(更安全、功能强)。
Q2:如何用test
命令判断多个文件是否存在且至少有一个可读?
A:通过逻辑或-o
([[
中用)组合条件。
file1="/etc/passwd" file2="/etc/shadow" if [ -e "$file1" -a -r "$file1" ] || [ -e "$file2" -a -r "$file2" ]; then echo "至少有一个文件存在且可读" else echo "文件不存在或不可读" fi # 或用[[简化(bash环境) if [[ (-e "$file1" && -r "$file1") || (-e "$file2" && -r "$file2") ]]; then echo "至少有一个文件存在且可读" fi
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/23240.html