如果我运行此命令,它不会打印是。
if [s == [Ss]]
then echo "yes"
fi
但是,如果我写双[]
,就像
if [[s == [Ss]]]
then echo "yes"
fi
它打印是
我想知道为什么
答案 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