为了账号安全,请及时绑定邮箱和手机立即绑定

linux(shell):if [[ ! ${file} =~ ^[0-9]+ ]] 求大神指教?

linux(shell):if [[ ! ${file} =~ ^[0-9]+ ]] 求大神指教?

_百慕大 2017-01-19 18:49:33
首先我要声明一下,我在虚拟机里照着敲,却达不到视频的效果,所以我说一下我对这条语句的看法:外面的[]是条件的标准用法,而次级的[]应该就是说明里面是一个正则表达式(第1点),那么现在我按照里面这个式子的优先级来解释一下先是“=“右边,在说右边之前,我再多几句:如果就单纯的一个正则表达式,那么^a就表示以a开头的匹配,如果^[^a]表示不以a开头的匹配,好了,我们再来说这个”=“右边,首先是一个"~"这在我看来应该是一个取反(按位取反)(第2点),但是我想我应该理解错了,然后是^[0-9]+表示的是以任意整数开头并且重复1到n次接着是”=“左边,${file}(第3点)明显是用一个变量来接收等号右边的值,然后再在最前面加上一个”!“,表明是相反的结果,即"!1==0"(C语言)第1点和第2点是否理解正确?第3点${file}是$file的标准用法?然后总结,我总结不了。。。。求大神指出错误
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

你的理解有些是对的,不过若你在思考前先看看手册就更好了,这样能避免多余的脑补。


一个中括号 [...] 和 两个中括号 [[...]] 的用法是相似的,它们都是用于条件判断表达式的,所以常跟在 if 后面作条件判断之用。 [...] 版本算是内建的功能,而[[...]] 版本是复合命令,除了完全支持 [...] 的功能外,还增加了正则表达式判断功能。

=~ 运算符就是进行正则表达式判断之用的,左侧的字符串会依右侧的正则表达式做匹配,若匹配则结果为true,不匹配则结果为false。 所以这里的 ~ 并不是取反


那么 ${file} 自然也就不是用来接收结果的变量了。 ${file} 本身的意义就是很正常的,你不要过多联想。

${file} 就是一个参数展开,也就是 file 的值。是的,这和 $file 是一样的,大括号是可选的,目的是明确标明参数。 $file 这样简单的情形看不出区别,但假如要展开的参数后面还有别的字符:

比如 $fileabc,我想将 file 参数展开的结果和后面的 abc 连成一个字符串,但 bash 会以为你要展开的参数是 fileabc,这时就可以用大括号将参数标识出来 ${file}abc 这样就没问题了。

我猜这里大概是要判断文件名是否为数字开头吧...


最前面的感叹号 !,没错,这是将前述的判断结果取反。

查看完整回答
1 反对 回复 2017-01-20
  • _百慕大
    _百慕大
    谢谢你的解答,由于我是按照路径来学习的,手册什么的还没看,确实有些地方不是很清楚
  • 1 回答
  • 0 关注
  • 3374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信