猿问

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

首先我要声明一下,我在虚拟机里照着敲,却达不到视频的效果,所以我说一下我对这条语句的看法:

外面的[]是条件的标准用法,而次级的[]应该就是说明里面是一个正则表达式(第1点),那么现在我按照里面这个式子的优先级来解释一下

先是“=“右边,在说右边之前,我再多几句:如果就单纯的一个正则表达式,那么^a就表示以a开头的匹配,如果^[^a]表示不以a开头的匹配,好了,我们再来说这个”=“右边,首先是一个"~"这在我看来应该是一个取反(按位取反)(第2点),但是我想我应该理解错了,然后是^[0-9]+表示的是以任意整数开头并且重复1到n次

接着是”=“左边,${file}(第3点)明显是用一个变量来接收等号右边的值,然后再在最前面加上一个”!“,表明是相反的结果,即"!1==0"(C语言)

第1点和第2点是否理解正确?

第3点${file}是$file的标准用法?

然后总结,我总结不了。。。。求大神指出错误

_百慕大
浏览 3465回答 1
1回答

onemoo

你的理解有些是对的,不过若你在思考前先看看手册就更好了,这样能避免多余的脑补。一个中括号 [...] 和 两个中括号 [[...]] 的用法是相似的,它们都是用于条件判断表达式的,所以常跟在 if 后面作条件判断之用。 [...] 版本算是内建的功能,而[[...]] 版本是复合命令,除了完全支持 [...] 的功能外,还增加了正则表达式判断功能。=~ 运算符就是进行正则表达式判断之用的,左侧的字符串会依右侧的正则表达式做匹配,若匹配则结果为true,不匹配则结果为false。 所以这里的 ~ 并不是取反。那么 ${file} 自然也就不是用来接收结果的变量了。 ${file} 本身的意义就是很正常的,你不要过多联想。${file} 就是一个参数展开,也就是 file 的值。是的,这和 $file 是一样的,大括号是可选的,目的是明确标明参数。 $file 这样简单的情形看不出区别,但假如要展开的参数后面还有别的字符:比如 $fileabc,我想将 file 参数展开的结果和后面的 abc 连成一个字符串,但 bash 会以为你要展开的参数是 fileabc,这时就可以用大括号将参数标识出来 ${file}abc 这样就没问题了。我猜这里大概是要判断文件名是否为数字开头吧...最前面的感叹号 !,没错,这是将前述的判断结果取反。
随时随地看视频慕课网APP
我要回答