如果你希望通过脚本运算获得的结果是你想要的,那么你需要应用到算术运算符参与算术运算以获得你所需的结果. 在Bash脚本中,一般比较语法都会放在方括号中.

单括号与双括号的对比

属性 单括号 [ ] 双括号 [[ ]]
括号两边都要有空格分隔
内部操作符与变量之间要有空格
字符串比较时需要在< >之前加入\进行转义
括号中字符串或者${}变量尽量使用”” 双引号扩住
括号中如若未使用""会进行模式和元字符匹配
括号中可以使用-a或者-o等进行逻辑运算
括号中可以使用&&或者\|\|进行逻辑运算
括号可以配合!使用

此外, [ ] 是bash 内置命令[[ ]] 是bash 关键词, 双方括号表达式会返回一个退出码.

==与-eq的对比以及延伸

一般来说, 使用 =或者==来做字符串的对比; 使用-eq来做数值的对比.

使用==来对比字符串

str命令 含义
[[ str ]] 判断字符串是否不为空
[[ -z str ]] 判断字符串是否为空,
[[ -n str ]] 判断字符串是否不为空
[[ str1 = str2 ]] 判断字符串是否相同
[[ str1 == str2 ]] 判断字符串是否相同
[[ str1 != str2 ]] 判断字符串是否不相等
[[ str1 \\< str2 ]] 判断按字典序排序str1是否在str2之前
[[ str1 \\> str2 ]] 判断按字典序排序str1是否在str2之后

使用 -eq 等命令来对比数值

num命令 含义
[[ val1 -eq val2 ]] 判断val1是否与val2相等
[[ val1 -ne val2 ]] 判断val1是否与val2不相等
[[ val1 -lt val2 ]] 判断val1是否小于val2
[[ val1 -le val2 ]] 判断val1是否小于等于val2
[[ val1 -gt val2 ]] 判断val1是否大于val2
[[ val1 -ge val2 ]] 判断val1是否大于等于val2

文件状态检查

命令 含义
-b filename 检查是否文件存在并且是块文件*
-c filename 检查是否文件存在并且是字符文件
-d path 检查是否文件存在并且是目录
-f filename 检查是否文件存在并且为正规文件
-g path 检查是否文件存在并且设置了SGID
-h filename 检查是否文件存在并且是符号链接文件
-p filename 见怕是否文件存在并且是命名管道
-s filename 检查是否文件存在并且文件大小大于0
-S filename 检查是否文件存在并且是socket
file1 -nt file2 检查是否file1比file2新
file1 -ot file2 检查是否file1比file2旧
file1 -ef file2 检查是否file1和file2 链接到了相同的文件

块存储的用户是可以读写块设备的软件系统.

文件存储的用户是自然人.

对象储存的用户是其他计算机软件.

Linux系统中所有文件/文件夹都是已文件的格式保存的. 但是为了更容易区分.文件和文件/文件夹不同的命令区分开来列出.

命令 含义
-u path 检查是否path制定的文件或目录存在并且设置了SUID
-w path 检查是否path制定的文件或目录存在并且可写
-x path 检查是否path指定的文件或目录存在并且可执行
-r path 检查是否文件/目录存在并且可读
-e filename 检查是否文件/目录存在
-O path 检查是否path存在并且被当前进程的有效用户id 的用户拥有
-G path 检查是否path 存在并且属于当前进程的有效用户id 的用户的用户组

双括号 [[ ]] 对比单括号 [ ] 的优势

  1. [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

  2. 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

  3. 使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

  4. bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错. 因此推荐直接选用双括号.