将字符串匹配到Bash中的多个globs

Ken*_*n J 1 bash

我正在尝试简化我的Bash 4脚本.我正在读取文件中的行,我想排除与某些子字符串匹配的行:

while read p; do
    if [[ $p != *-ext ]]; then
        if [[ $p != *-backend ]]; then
                if [[ $p != *-vip ]]; then
                    echo $p
                fi
            fi
        fi
    fi
done < $hostsfile
Run Code Online (Sandbox Code Playgroud)

因此,如果该行不以-ext或-backend或-vip结尾,则打印它.什么是一种更简单的方法(单行程不链接&&'s)来实现这一目标?

che*_*ner 5

使用扩展模式.这需要在extglob选项中启用,但这是(暂时)默认情况下启用了的RHS !=内部操作者[[在bash4.2或更高版本.

shopt -s extglob  # if necessary
if [[ $p != *-@(backend|vip|ext) ]]; then
Run Code Online (Sandbox Code Playgroud)

使用正则表达式的等价物将是

if ! [[ $p =~ (backend|vip|ext)$ ]]; then
Run Code Online (Sandbox Code Playgroud)

没有其他选项需要设置的,但正则表达式是不是隐含锚,所以你并不需要匹配类的字符串的开头*-做的模式,但你也需要将字符串的结尾明确匹配$.此外,没有不匹配的正则表达式运算符(如!~在Perl中),因此您需要使用=~和否定命令的退出状态.