shell中括号的特殊用法及if多条件判断
条评论前言
终究还是有些符号,用得不好或者敲错调试半天也不知道问题在哪。搜了些符号用法,做个笔记备用备查。
bash [ ]
单双括号
基本要素:
[ ]
两个符号左右都要有空格分隔- 内部操作符与操作变量之间要有空格:如
[ “a” = “b” ]
- 字符串比较中,
> <
需要写成\> \<
进行转义 [ ]
中字符串或者${}
变量尽量使用""
双引号扩住,避免值未定义引用而出错的好办法[ ]
中可以使用–a –o
进行逻辑运算[ ]
是 bash 内置命令:[ is a shell builtin
测试时逻辑操作符
-a
:逻辑与,操作符两边均为真,结果为真,否则为假。-o
:逻辑或,操作符两边一边为真,结果为真,否则为假。!
:逻辑否,条件为假,结果为真。
举例:
[ -w result.txt-a -w score.txt ] ;echo $?
// 测试两个文件是否均可写
bash [[ ]]
双方括号
基本要素:
[[ ]]
两个符号左右都要有空格分隔- 内部操作符与操作变量之间要有空格:如
[[ “a” = “b” ]]
- 字符串比较中,可以直接使用
> <
无需转义 [[ ]]
中字符串或者${}
变量尽量如未使用""
双引号扩住的话,会进行模式和元字符匹配
1 | [root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok" |
[[ ]]
内部可以使用&& ||
进行逻辑运算[[ ]]
是 bash keyword:[[ is a shell keyword
[[ ]]
其他用法都和 [ ]
一样,二者共同特性:
&& || -a –o
处理
[ exp1 -a exp2 ] = [[ exp1 && exp2 ]] = [ exp1 ] && [ exp2 ] = [[ exp1 ]] && [[ exp2 ]]
[ exp1 -o exp2 ] = [[ exp1 || exp2 ]] = [ exp1 ]|| [ exp2 ] = [[ exp1 ]] || [[ exp2 ]]
1 | [root@localhost ~]# if [[ "a" == "a" && 2 -gt1 ]] ;then echo "ok" ;fi |
[[ ]]
和 [ ]
都可以和 !
配合使用
- 优先级
!
>&&
>||
- 逻辑运算符 < 关系运算符
- 逻辑运算符:
! && || -a -o
- 关系运算符:
< > \> \< == = != – eq –ne -gt -ge –lt -le
[[ ]]
比 [ ]
具备的优势
[[
是 bash 程序语言的关键字。并不是一个命令,[[ ]]
结构比[ ]
结构更加通用。在[[
和]]
之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。- 支持字符串的模式匹配,使用
=~
操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]]
,结果为真。[[ ]]
中匹配字符串或通配符,不需要引号。 - 使用
[[ ... ]]
条件判断结构,而不是[ ... ]
,能够防止脚本中的许多逻辑错误。比如&&
、||
、<
和>
操作符能够正常存在于[[ ]]
条件判断结构中,但是如果出现在[ ]
结构中的话,会报错。 - bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
if
条件判断中有多个条件
或 ||
:
1 |
|
1 |
|
1 |
|
或 -o
:
1 |
|
且 -a
:
1 |
|
多条件组合
1 | score=$1 |
记住必须加两个中括号。
总结
Shell中的括号有其特殊的用法,现总结如下:
符号 $
后的括号
${a}
: 变量a
的值,在不引起歧义的情况下可以省略大括号。$(cmd)
:命令替换,结果为shell命令cmd
的输出,和cmd
效果相同,不过某些Shell版本不支持$()
形式的命令替换,如tcsh
。$((exp))
:和expr exp
效果相同,计算数学表达式exp
的数值,其中exp
只要符合C语言
的运算规则即可,甚至三目运算符和逻辑表达式都可以计算。
多条命令执行
(cmd1;cmd2;cmd3)
:新开一个子shell顺序执行命令cmd1>cmd2>cmd3
,各命令之间用分号隔开,最后一个命令后可以没有分号。{cmd1;cmd2;cmd3;}
:在当前shell顺序执行命令cmd1>cmd2>cmd3
,各命令之间用分号隔开,最后一个命令后必须有分号,第一条命令和左括号之间必须用空格隔开。- 对
{}
和()
而言,括号中的重定向符只影响该条命令,而括号外的重定向符影响到括号中的所有命令。
双括号的特殊用法
(())
:增强括号的用法,常用于算术运算比较. 双括号中的变量可以不使用$
符号前缀,只要括号中的表达式符合C语言运算规则,支持多个表达式用逗号分开。比如可以直接使用for((i=0;i<5;i++))
,如果不使用双括号,则为for i in seq 0 4
或者for i in {0..4}
。再如可以直接使用if (($i<5))
,如果不使用双括号,则为if [ $i -lt 5 ]
。[[]]
:增强方括号用法,常用于字符串的比较. 主要用于条件测试,双括号中的表达式可以使用&&
,||
,<
,>
等C语言语法。比如可以直接使用if [[ $a != 1 && $a != 2 ]]
,如果不适用双括号,则为if [ $a -ne 1] && [ $a != 2 ]
或者if [ $a -ne 1 -a $a != 2 ]
。
参考文档
本文标题:shell中括号的特殊用法及if多条件判断
文章作者:凹凸曼
发布时间:2021-11-03
最后更新:2021-11-03
原始链接:https://sobaigu.com/bash-shell-if-parameters.html
版权声明:转载请务必保留本文链接和注明内容来源,并自负版权等法律责任。