如何控制bash条件表达式中特殊参数*的输出?

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

我有一个文件名 fofo.l 存储在变量 FI 中。我想检查文件名中是否有“.l”。如果是,则执行command1。如果没有,则执行 command2。

我用过

set -x
并尝试过:

if test $FI == *.l*; then echo done; else echo fail; fi 

即输出:

+ test fofo.l == esc.txt execve.c fofo. fofo.l foo1.cpp foo2.c foo.c foo.gz foo.l fool.sl foo.save foo.sl foo.xz goo.xz goo.xz.orig mprint.c myecho2.c myecho.c nano.10558.save p1.c pm.c pm.o term.cpp zipT.gz
bash: test: too many arguments
+ echo fail
fail

据我所知,bash 只是将 * 替换为任意数量的字符。但有很多合适的文件。那么我该如何解决这个问题呢?我应该减少争论的数量吗?我应该走另一条路吗?

linux bash shell syntax conditional-statements
1个回答
1
投票

通配符扩展用于查找实际文件系统中的文件名。要测试字符串是否包含您感兴趣的字符,可以使用正则表达式匹配运算符,

=~
:

#!/bin/bash -e

function TestIt
{
    if [[ $1 =~ \.l ]]; then
        echo "$1 contains \".l\"."
    else
        echo "$1 does not contain \".l\"."
    fi
}

TestIt "fofo.l"
TestIt ".l"
TestIt "foo.landmore"
TestIt "xl"
TestIt "fofoxl"

输出:

fofo.l 包含“.l”。
.l 包含“.l”。
foo.landmore 包含“.l”。
xl 不包含“.l”。
fofoxl 不包含“.l”。
© www.soinside.com 2019 - 2024. All rights reserved.