【问题标题】:checking if a string is contained in other string in shell检查一个字符串是否包含在 shell 中的其他字符串中
【发布时间】:2019-08-06 03:39:07
【问题描述】:

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

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

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

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

它打印出是

我想知道为什么

【问题讨论】:

  • 您不能在test(与[...] 同义)中使用字符类(例如[...])。只有 bash [[ ... ]] 允许在其中使用字符类。
  • 这一切都取决于命令[s 的结果。尝试直接执行[s(这是一个奇怪的命令名称,但也许您有一个具有该名称的可执行文件),但我希望您的第一个示例给出类似于[s: no such command的错误
  • 除了空格错误,[[[ 是两个不同的命令,只有[[ 支持与=(=) 运算符的模式匹配。

标签: string shell if-statement sh contains


【解决方案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

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

【讨论】:

  • POSIX expr 没有 index 子命令。请改用expr s : '[sS]$'
  • @chepner 你是对的match(或':')是唯一的POSIX expr。啊啊!是coreutils,证明: match substr index length。已更新。
【解决方案2】:

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

inp=s

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

【讨论】:

    【解决方案3】:

    比较字符串时,双括号语法具有 shell globbing 的特点。当您尝试与大写和小写进行比较时。 双括号语法也有助于正则表达式模式匹配。 你给出的条件类似于

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 2018-08-27
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多