如果你希望通过脚本运算获得的结果是你想要的,那么你需要应用到算术运算符参与算术运算以获得你所需的结果. 在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 的用户的用户组 |
双括号 [[ ]] 对比单括号 [ ] 的优势
[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错. 因此推荐直接选用双括号.