String 检查一个字符串是否包含在shell中的其他字符串中
如果我运行这个,它不会打印yesString 检查一个字符串是否包含在shell中的其他字符串中,string,shell,if-statement,sh,contains,String,Shell,If Statement,Sh,Contains,如果我运行这个,它不会打印yes if [s == [Ss]] then echo "yes" fi 但是,如果我写双[],那么 if [[s == [Ss]]] then echo "yes" fi 是的 我想知道为什么在比较字符串时,双括号语法使用shell globbing。当你试图与大写和小写进行比较时。 双括号语法还有助于正则表达式模式匹配。 你给出的条件与 if [[ "$stringvar" == *string* ]]; then 这意味着星号(“*”)将扩展到任何内容,正
if [s == [Ss]]
then echo "yes"
fi
但是,如果我写双[]
,那么
if [[s == [Ss]]]
then echo "yes"
fi
是的
我想知道为什么在比较字符串时,双括号语法使用shell globbing。当你试图与大写和小写进行比较时。 双括号语法还有助于正则表达式模式匹配。 你给出的条件与
if [[ "$stringvar" == *string* ]]; then
这意味着星号(“*”)
将扩展到任何内容,正如您在正常命令行使用中可能知道的那样。因此,如果$stringvar
在任何地方包含短语“string”
,则条件将返回true。也允许使用其他形式的shell globbing。如果要同时匹配“String”
和“String”
,可以使用以下语法:
if [[ "$stringvar" == *[sS]tring* ]]; then
继续我的评论,POSIX shell不允许在
测试中使用字符类(例如[…]
)(与[…]
同义)。只有bash[[…]
允许在其中使用字符类
如果您安装了coreutils
(几乎每个发行版都安装了),您仍然可以将字符列表与返回字符列表中第一个字符的字符串中的索引(基于1)的字符串进行匹配。对于您的情况,您可以使用:
if [ $(expr index "s" "sS") -gt '0' ]; then
echo yes;
fi
其中,expr index“s”“sS”
是索引字符串charlist
的常见形式,需要在其前面使用expr
如果您仅限于POSIX shell,那么可以使用expr string:regex
与正则表达式进行匹配
if [ $(expr "s" : '[sS]$') -gt '0' ]; then
echo yes;
fi
(注意:正则表达式必须匹配所测试字符串的全部内容)[
不支持模式匹配。请改用大小写
inp=s
case $inp in
[sS]) echo "Matched s/S" ;;
*) echo "Did not match s/S" ;;
esac
不能在测试中使用字符类(例如[…]
)(与[…]
同义)。只有bash[…]
允许在其中使用字符类。这完全取决于命令[s
的结果。请尝试直接执行[s
(对于一个命令来说这是一个奇怪的名称,但可能您有一个具有该名称的可执行文件),但我希望您的第一个示例会给出一个类似于[s:没有这样的命令
空格错误,[
和[
是两个不同的命令,只有[
支持与=(=)进行模式匹配
operator.POSIXexpr
没有索引
子命令。请改用expr s:'[sS]$'
。@chepner您是对的match
(或':“
)是唯一一个POSIXexpr
证明:match substr索引长度
已更新的coreutils
。