() | 复合指令 |
---|
[] | 文件测试 -eq形式数字比较 |
{} | 复合指令 |
(()) | 数字比较、自增资减 |
[[]] | 文件测试、 字符串比较 |
{{}} | |
$() | 命令 |
$[] | 整数计算 需要变量接收 |
${} | 变量 |
`` | 命令 |
条件测试的基本语法
- 条件为真,整个条件测试的返回值为0
- 条件为假,测试语句的返回值为非0值
条件测试语法 | 说明 |
---|
test 条件表达式 | test命令和“<测试表达式>”之间至少有一个空格 |
[ 条件表达式 ] | test命令的用法相同,的边界和内容之间至少有一个空格 |
[[ 条件表达式 ]] | 这是通过[[]] 进行条件测试表达式的方法,是比test和[]更新的语法格式。[[]] 的边界和内容之间至少有一个空格。 |
((条件表达式)) | 一般用于if语句里。(())两端不需要有空格 |
文件测试运算符
- [ -e /root ]
- [[ -e /root ]]
操作符 | 说明 | 举例 |
---|
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-S | 是否为socket文件 | |
-p | 是否为管道符文件 | |
-L | 是否为链接文件 | |
-u | 是否有suid的权限 | |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了冒险位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
f1 -nt f2 | 文件f1比文件f2新则为真,根据文档修改时间来计算 | |
f1 -ot -f2 | 文件f1比文件f2旧则为真,根据文档修改时间来计算 | |
示例:
//普通文件测试
[root@localhost ~]
yes
//目录测试
[root@localhost ~]
yes
//测试文件属性
[root@localhost ~]
-rw-r--r-- 1 root root 0 8月 28 12:30 file1.txt
[root@localhost ~]
yes
[root@localhost ~]
no
字符串运算符
常用字符串测试操作符 | 说明 |
---|
-n “字符串” | 若字符串的长度不为0,则为真 |
-z “字符串” | 若字符串的长度为0,则为真 |
" 串1 " = ” 串2 “ | 字符串1等于字符串2,则为真 |
" 串1 " != ” 串2 “ | 若字符串1不等于字符串2,则为真 |
//-n如果字符串长度不为零输出yes,否则输出no
[root@localhost ~]
yes
[root@localhost ~]
no
//-z如果字符串长度为零输出yes,否则输出no
[root@localhost ~]
no
[root@localhost ~]
yes
// 字符串相等比较
注意:=的左右有空格,没有空格将会导致逻辑错误。
[root@localhost ~]
no
[root@localhost ~]
yes
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ] -------$判断z字符串是否为空,不空为真,空为假
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
关系运算符
在[]以及test中使用的比较符号 | 在(())和[[]]中使用的比较符号 | 说明 |
---|
-eq | == 或 = | 相等 |
-ne | != | 不等 |
-gt | > | 大于 |
-ge | >= | 大于等于 |
-lt | < | 小于 |
-le | <= | 小于等于 |
| 两者都可以 | 不能用-eq |
---|
数字比较 | test [] [[]] | (()) |
字符比较 | [[]] | test [] (()) |
[root@localhost ~]
yes
[root@localhost ~]
admin
[root@localhost ~]
[student@localhost ~]$ [ `id -u` -eq 0 ] && echo admin || echo other
other
扩展:判断变量是不是数字
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
0
[root@localhost ~]
1
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
变量的运算
1、算数运算符
算术运算符号 | 意义 |
---|
+ 、- | 加号、减号 |
* 、 / 、% | 乘法、除法、取余 |
** | 幂运算 |
~ 、` | 、 &、 ^` |
++ 、- - | 自增和自减,可以放在变量的前面也可以放在变量的后面 |
= 、+= 、-= 、*= 、/= 、%= | 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1 |
! 、&& 、` | |
< 、<= 、> 、>= | 比较符号(小于、小于等于、大于、大于等于) |
== 、!= 、= | 比较符号(相等、不相等;对于字符串,= 也可以表示相当于) |
<< 、>> | 向左移位、向右移位 |
2、算数运算命令
运算操作符/运算命令 | 说明 |
---|
$(( )) | 用于整数运算,效率很高,推荐使用。 |
let | 用于整数运算,和 $(()) 类似。 |
$[] | 用于整数运算,不如 $(()) 灵活。 |
bc | Linux下的一个计算器程序,可以处理整数 和小数。 |
expr | 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。 |
declare -i | 将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等 |
awk | 既可以用于整数运算,也可以用于小数运算 |
[root@bogon ~]
[root@bogon ~]
[root@bogon ~]
[root@bogon ~]
[root@bogon ~]
3+5
[root@bogon ~]
[root@bogon ~]
逻辑操作符/布尔运算符
运算符 | 布尔符 | 说明 | 举例 |
---|
&& | -a | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | -o | 逻辑的 OR | `[[ $a -lt 100 |
! | ! | 非 | not,非,两端相反,则结果为真 |
示例:
[root@localhost ~]
yes
[root@localhost ~]
yes