检查一个字符串是否包含在外壳程序的其他字符串中

时间:2019-03-15 05:34:15

标签: string shell if-statement sh contains

如果我运行此命令,它不会打印是。

if [s == [Ss]]
then echo "yes"
fi

但是,如果我写双[],就像

if [[s == [Ss]]]
then echo "yes"
fi

它打印是

我想知道为什么

3 个答案:

答案 0 :(得分:1)

比较字符串时,双括号语法具有Shell Globing的功能。当您尝试同时使用大写字母和小写字母时。 同样,双括号语法有助于进行正则表达式模式匹配。  您提供的条件类似于

if [[ "$stringvar" == *string* ]]; then

这意味着星号(“*”)将扩展为几乎所有内容,就像您从正常的命令行用法中可能会知道的那样。因此,if $stringvar在任何地方都包含短语“string”,条件将返回true。也可以使用其他形式的Shell Globing。如果您想同时匹配“String”“string”,则可以使用以下语法:

if [[ "$stringvar" == *[sS]tring* ]]; then

答案 1 :(得分:1)

根据我的评论,POSIX-shell不允许在[...](与test同义)内使用字符类(例如[...])。只有bash [[ ... ]]允许其中包含字符类。

如果您安装了coreutils(关于每个发行版),您仍然可以将字符列表与返回第一个字符的字符串中基于索引(从1开始)的字符串匹配在字符列表中。对于您的情况,您可以使用:

if [ $(expr index "s" "sS") -gt '0' ]; then
    echo yes; 
fi

expr index "s" "sS"index string charlist的通常形式,需要在其前面使用expr

如果限于POSIX shell,则可以使用expr string : regex来匹配正则表达式。

if [ $(expr "s" : '[sS]$') -gt '0' ]; then
    echo yes; 
fi

注意:正则表达式必须与要测试的字符串的全部内容匹配)

答案 2 :(得分:0)

[不支持模式匹配。请改用case

inp=s

case $inp in
  [sS]) echo "Matched s/S" ;;
  *) echo "Did not match s/S" ;;
esac