【问题标题】:KSH check if string starts with substringKSH 检查字符串是否以子字符串开头
【发布时间】:2011-05-04 01:59:47
【问题描述】:

我需要检查变量是否具有以指定子字符串开头的字符串值。

在 Python 中应该是这样的:

foo = 'abcdef'
if foo.startswith('abc'):
    print 'Success'

在 Ksh 中检查字符串 $foo 是否以子字符串 bar 开头的最明确方法是什么?

【问题讨论】:

    标签: shell string ksh


    【解决方案1】:

    这很简单,但看起来有点奇怪:

    if [[ "$foo" == abc* ]]; then ...
    

    人们会假设 ksh 会使用当前目录中的文件扩展模式,但它会进行模式匹配。不过,您需要[[。单个[ 不起作用。如果foo 中没有空格,则引号不是绝对必要的。

    【讨论】:

    • 在双括号内,即使$foo 为空或未设置,也不需要引号。
    • 该解决方案看起来与我正在寻找的完全一样。但不幸的是,它在我的 ksh 中不起作用。它看起来像 ksh88,我想这些技巧太老了。
    • 如果$foo 中有“=”怎么办?
    • @user443854:BASH 扩展的工作方式是if 命令将foo 的内容作为单个参数获取,所以没关系。而if 命令只查找恰好是= 的参数,它不会尝试进一步拆分参数。
    【解决方案2】:

    你也可以做正则匹配:

    if [[ $foo =~ ^abc ]]
    

    对于更复杂的模式,我建议使用变量而不是直接将模式放在测试中:

    bar='^begin (abc|def|ghi)[^ ]* end$'
    if [[ $foo =~ $bar ]]
    

    【讨论】:

      【解决方案3】:

      还有:

      foo='abcdef'
      pattern='abc*'
      
      case "$foo" in
          $pattern) echo startswith ;;
          *) echo otherwise ;;
      esac
      

      【讨论】:

      • 您当然不需要临时变量。 case $foo in 'abc'* ) echo yes ;; esac
      • 可移植回 solaris 9 /bin/sh 和 @tripleee 的上述简化工作
      猜你喜欢
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多