如何在 Bash 中使用单方括号“

如何在 Bash 中使用单方括号“

我想检测输入参数是否包含某些子字符串。

我尝试了以下脚本:

#1:

#!/bin/sh

if  [ $1 = *abc* ]
then
    echo contains abc
else
    echo not contains abc
fi

#2:

if  [ "$1" = "*abc*" ]
then
    echo contains abc
else
    echo not contains abc
fi

#3:

if  [ "$1" = *"abc"* ]
then
    echo contains abc
else
    echo not contains abc
fi

#1 ~ #3 都不起作用。

但下面的[[可以轻松工作:

#4:

if  [[ $1 = *"abc"* ]]
then
    echo contains abc
else
    echo not contains abc
fi

#5:

if  [[ $1 = *abc* ]]
then
    echo contains abc
else
    echo not contains abc
fi

那么单曲可以制作吗[

添加 1 - 2021 年 9 月 21 日上午 10:55

刚刚发现一个非常有用的线程:

Bash 运算符 [[ vs [ vs ( vs ((?

答案1

[[一个内置的 shell。它是 的一个更通用的版本[,它是一个可执行文件/usr/bin(请参阅文档和man页面test了解更多详情)。

[更便携,同时[[更通用,通常是您应该使用的变体。

if  [[ $1 == *"abc"* ]]; then
    echo "substring present"
else
    echo "substring not present"
fi

测试子字符串的另一个好方法是使用正则表达式运算符:

if [[ "$1" =~ .*"abc".* ]]; then
    echo "contains"
else
    echo "doesn't contain"
fi

注意后面的表达式=~正则表达式而不仅仅是通配符。


检查子字符串的另一种方法是使用case

case $1 in
    *"abs"*)
        echo "substring present"
        ;;
    *)
        echo "substring not present"
        ;;
esac

或者,您可以使用grep,正如 CPH 在他的帖子中解释的那样。但是您需要确保使用这里-文档:

if grep -q "abc" <<< "$STR"; then
    echo "substring present"
else
    echo "substring not present"
fi

答案2

您想使用单括号有什么原因吗?

一个更简单的方法是这样的:

if echo "$1" | grep 'abc' > /dev/null; then
    # Do if true substring found
else
    # substring not found
fi

如果您不熟悉该grep命令,它只是在字符串中搜索您给出的参数/值。如果您想使用该标志,您可以忽略大小写-i,上面将专门查找参数“$1”中的小写“abc”

相关内容