Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 检查一个字符串是否包含在shell中的其他字符串中_String_Shell_If Statement_Sh_Contains - Fatal编程技术网

String 检查一个字符串是否包含在shell中的其他字符串中

String 检查一个字符串是否包含在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 这意味着星号(“*”)将扩展到任何内容,正

如果我运行这个,它不会打印yes

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.POSIX
expr
没有
索引
子命令。请改用
expr s:'[sS]$'
。@chepner您是对的
match
(或
':“
)是唯一一个POSIX
expr
证明
:match substr索引长度
已更新的
coreutils