bash 脚本检查文件名以预期字符串开头

问题描述 投票:0回答:2

使用 bash 脚本在 OS X 上运行:

sourceFile=`basename $1`
shopt -s nocasematch
if [[ "$sourceFile" =~ "adUsers.txt" ]]; then echo success ; else echo fail ; fi

上面的方法有效,但是如果用户获取一个名为

adUsers_new.txt
的文件怎么办?

我尝试过:

if [[ "$sourceFile" =~ "adUsers*.txt" ]]; then echo success ; else echo fail ; fi

但是通配符在这种情况下不起作用。 我编写此脚本是为了允许用户对源文件名进行不同的迭代,该文件名必须以

aduser
开头并具有
.txt
文件扩展名。

bash if-statement pattern-matching string-matching
2个回答
7
投票

bash
中,您可以使用以下命令获取 shell 变量的前七个字符:

${sourceFile:0:7}

最后四个是:

${sourceFile:${#sourceFile}-4}

有了这些知识,只需在通常使用变量本身的地方使用那些表达式,就像下面的脚本一样:

arg=$1
shopt -s nocasematch
i7f4="${arg:0:7}${arg:${#arg}-4}"
if [[ "${i7f4}" = "adusers.txt" ]] ; then
    echo Okay
else
    echo Bad
fi

您可以通过以下文字看到它的实际效果:

pax> check.sh hello
Bad

pax> check.sh addUsers.txt
Bad

pax> check.sh adUsers.txt
Okay

pax> check.sh adUsers_new.txt
Okay

pax> check.sh aDuSeRs_stragngeCase.pdf.gx..txt
Okay

6
投票

=~
运算符需要正则表达式,而不是通配符。
==
接受通配符,但不应引用它们:

if [[ "$sourceFile" == adUsers*.txt ]]; then echo success; else echo fail; fi

当然,你也可以使用正则表达式,但这有点矫枉过正:

if [[ "$sourceFile" =~ ^adUsers.*\.txt$ ]]; then echo success; else echo fail; fi

请注意,regexp 默认是打开的 (

a
==
.*a.*
),而 glob 是关闭的 (
a
!=
*a*
)。

© www.soinside.com 2019 - 2024. All rights reserved.