用于检查文件名的bash脚本以期望的字符串开头

cho*_*hop 5 bash if-statement pattern-matching string-matching

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

sourceFile=`basename $1`
shopt -s nocasematch
if [[ "$sourceFile" =~ "adUsers.txt" ]]; then echo success ; else echo fail ; fi
Run Code Online (Sandbox Code Playgroud)

上面的工作,但如果用户来源一个名为adUsers_new.txt?的文件怎么办?

我试过了:

if [[ "$sourceFile" =~ "adUsers*.txt" ]]; then echo success ; else echo fail ; fi
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,通配符不起作用.我正在编写此脚本以允许用户对源文件名进行不同的迭代,该文件名必须以文件扩展名开头aduser并具有.txt文件扩展名.

pax*_*blo 6

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

${sourceFile:0:7}
Run Code Online (Sandbox Code Playgroud)

最后四个:

${sourceFile:${#sourceFile}-4}
Run Code Online (Sandbox Code Playgroud)

有了这些知识,只需使用那些通常使用变量本身的表达式,如下面的脚本:

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

您可以使用以下记录查看它的实际操作:

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
Run Code Online (Sandbox Code Playgroud)


Dmi*_*rov 6

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

if [[ "$sourceFile" == adUsers*.txt ]]; then echo success; else echo fail; fi
Run Code Online (Sandbox Code Playgroud)

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

if [[ "$sourceFile" =~ ^adUsers.*\.txt$ ]]; then echo success; else echo fail; fi
Run Code Online (Sandbox Code Playgroud)

请注意,regexp 默认是打开的 ( a== .*a.*),而 glob 是关闭的 ( a!= *a*)。