为什么我的正则表达式在 bash“if”中不起作用?

为什么我的正则表达式在 bash“if”中不起作用?

这是我的代码:

if [ -f /Applications/xml[0-9].pl ]

我也尝试过使用-f =~双括号,但似乎都不起作用。

我首先认为正则表达式可能有问题,但我尝试了这个。

echo h1 | sed 's/h[0-9]/h/'

这奏效了。我在这里做错了什么?

答案1

您无法使用正则表达式或像这样的 glob 来测试文件。您必须迭代文件:

for file in /Applications/xml[0-9].pl; do if [ -f "$file" ]; then ...

答案2

bash 在评估条件之前扩展正则表达式。如果您的目录包含三个名为

/Applications/xml0.pl
/Applications/xml1.pl
/Applications/xml2.pl

你的if声明看起来像

if [ -f /Applications/xml0.pl /Applications/xml1.pl /Applications/xml2.pl ]]

这在语法上是不正确的。当您想使用以下命令查找文件是否存在时,您需要完整指定文件名

for file in /Applications/xml[0-9].pl
do
    if [ -f ${file} ]

或者如果可以的话,使用该find命令对文件执行任何您想要执行的操作。

相关内容