Techyou labs
文章RSS
评论RSS
登录
真正的爱应该超越生命的长度,心灵的宽度,灵魂的深度
搜索
关于作者
文章分类
Default
Linux/Unix
Database
Cloud
Networking
Security
Programming
最新文章
openvpn自签名证书
带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
Unicode 中的 BIDI 双向性算法[转]
在linux中设置优先使用ipv4,而不是ipv6
linux下WPS高分辨率下因字体缩放导致字体发虚的问题
ssh-rsa not in pubkeyacceptedalgorithms问题解答及处理办法 Permission denied (publickey)
在 Ubuntu 22.04 中使用 PipeWire 替换 PulseAudio
MYSQL简单监控指标
deepin-wine6-stable下TIM悄悄崩溃问题
openwrt 设置ipv6地址分配
最新评论
renothing: 备注:路由器端优先设置ipv4并不影响客户端的ip...
renothing: 二次反向代理跟你应用程序得处理时间有关系吧?尤其是...
二次反向代理性能很差,怎么优化的?: 我也用nginx 做了个二次反向代理,但是并发连3...
hostyep: 交换链接么?目前每天保持30个左右对口IP,每月都...
yzhkpli: error while loading share...
美肤宝: 感谢分享。。。
lq: 嗯 喜欢弄得点单点
按月归档
August 2023
March 2023
December 2022
November 2022
September 2022
August 2022
March 2022
January 2022
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
February 2021
September 2020
May 2020
September 2019
August 2019
July 2019
June 2019
May 2019
January 2019
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
April 2018
March 2018
December 2017
October 2017
September 2017
August 2017
April 2017
March 2017
February 2017
August 2016
July 2015
November 2014
September 2014
August 2014
July 2014
June 2014
July 2013
April 2013
September 2012
July 2012
May 2012
April 2012
February 2012
January 2012
December 2011
November 2011
October 2011
September 2011
August 2011
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
June 2009
May 2009
April 2009
March 2009
February 2009
December 2008
November 2008
September 2008
August 2008
July 2008
June 2008
常用标签
Mysql
nginx
mysql优化
linux
debian
Powered by
Typecho)))
Optimized by
EAimTY
Shell 中()、(())、[]、[[]]、{}的作用和区别
December 11, 2008
# []和[[]] 在写Shell脚本的时候,经常在写条件判断语句时不知道该用`[]` 还是` [[]]`,首先我们来看他们的类别: ``` $type [ [[ test [ is a shell builtin [[ is a shell keyword test is a shell builtin ``` `[` 和`test` 是 Shell 的内部命令,而`[[`是Shell的关键字。 ``` $test -f settings.py && echo True True $[ -f settings.py ] && echo True True ``` [ 和test 是相等的。 ``` $[ 2 < 1 ] && echo True || echo False True $[[ 2 < 1 ]] && echo True || echo False False ``` 既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。 ``` x=1 y=1 $[ $x == 1 && $y == 1 ] && echo True || echo False -bash: [: missing `]' False $[[ $x == 1 && $y == 1 ]] && echo True || echo False True $[ $x == 1 -a $y == 1 ] && echo True || echo False True ``` 在`[[`中使用`&&`和`||`表示逻辑与和逻辑或。`[`中使用`-a` 和`-o` 表示逻辑与和逻辑或。 ``` $[[ 'abcd' == a*d ]] && echo True || echo False True $[ 'abcd' == a*d ] && echo True || echo False False ``` `[[`支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。 ## 小结1: 使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话,会报错。比如可以直接使用`if [[ $a != 1 && $a != 2 ]]` 如果不使用双括号, 则为`if [ $a -ne 1] && [ $a != 2 ]`或者`if [ $a -ne 1 -a $a != 2 ]` bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。 ``` $[ !(pip list | grep pip) ] && echo True || echo False -bash: [: too many arguments False $[[ !(pip list | grep pip) ]] && echo True || echo False True ``` # $( ) 与`` (反引号) 在 bash shell 中,`$( )`与 ` `` ` (反引号) 都可用做命令替换用。 例如 `version=$(uname -r)`和`` version=`uname -r` ``都可以是version得到内核的版本号 各自的优缺点: 1. ` `` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高,但反单引号容易打错或看错。 2. `$()`并不是所有shell都支持。 `${ }`用于变量替换。一般情况下,`$var `与`${var} `并没有什么不一样,但是用 `${ }` 会比较精确的界定变量名称的范围。 `${ }`的模式匹配功能: 1. `# `是去掉左边(在键盘上#在$之左边) 2. `%` 是去掉右边(在键盘上%在$之右边) 3. `#`和`%`中的单一符号是最小匹配,两个相同符号是最大匹配。 `${variable#pattern}`:shell在variable中查找,看它是否以给定的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式 `${variable##pattern}`:shell在variable中查找,看它是否以给定的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最长的匹配模式 `${variable%pattern}`:shell在variable中查找,看它是否以给定的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式 `${variable%%pattern}`:shell在variable中查找,看它是否以给定的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式 这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。 # $[] 和 $(()) `$[]`和`$(())`是一样的,都是进行数学运算的。支持+ - * / %(“加、减、乘、除、取模”)。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。 ``` $ a=5; b=7; c=2 $ echo $(( a+b*c )) 19 $ echo $(( (a+b)/c )) 6 $ echo $(( (a*b)%c)) 1 ``` 在` $(( ))` 中的变量名称,可于其前面加` $` 符号来替换,也可以不用,如: `$(( $a + $b * $c)) `也可得到 19 的结果 此外,`$(( )) `还可作不同进位(如二进制、八进位、十六进制)运算,只是,输出结果皆为十进制而已: `echo $((16#2a)) `结果为 42 (16进位转十进制) # (( ))及[[ ]] 分别是`[ ]`的针对数学比较表达式和字符串表达式的加强版。 其中 `[[ ]]`中增加模式匹配特效; `(( ))`不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:  ##小结2: 数学运算使用`(())`,字符串运算使用`[[]]` # 参考 - http://blog.csdn.net/taiyang1987912/article/details/39551385 - http://blog.csdn.net/yongan1006/article/details/7195303 - https://www.shellcheck.net/
暂无评论
添加新评论
称呼
Email
网站
取消回复
内容
发表评论