确定第一个字符串是否以第二个字符串开头

确定第一个字符串是否以第二个字符串开头

JavaScript 有一个函数可以实现这一点:

'world'.startsWith('w')
true

我如何用 shell 测试这个?我有这个代码:

if [ world = w ]
then
  echo true
else
  echo false
fi

但它失败了,因为它正在测试相等性。我更喜欢使用内置函数,但此页面中的任何实用程序都是可以接受的:

http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

答案1

如果您的 shell 是 bash: 在双括号内,则 == 运算符的右侧是一个模式,除非完全引用:

if [[ world == w* ]]; then
    echo true
else
    echo false
fi

或者更简洁:[[ world == w* ]] && echo true || echo false[*]

如果您不是专门针对 bash:使用 case 语句进行模式匹配

case "world" in
    w*) echo true ;;
    *)  echo false ;;
esac

[*] 但你需要小心表单,A && B || C因为C如果任何一个失败了或者B 失败。该if A; then B; else C; fi表格将仅有的如果A失败则执行C。

答案2

将变量设置为该值(这里我们设置$strworld):

str=world

然后:

if [ -n "${str%%w*}" ]
then
  echo false
else
  echo true
fi
  1. w*积极地从 的开头删除模式$strw*匹配w后跟任意数量的字符,因此如果可能的话它将匹配整个字符串。
  2. 如果还剩下什么,$str则不以 开头w

或者:

if [ "$str" = "${str#w}" ]
then
  echo false
else
  echo true
fi
  1. w如果可能的话,从 中删除$str
  2. 与之比较$str
  3. 如果相等(即删除没有执行任何操作),$str则不以 开头w

答案3

sh其标准语法是一个case构造:

string=world
start=w
case $string in
  ("$start"*) printf '%s\n' "$string starts with $start";;
  (*)         printf '%s\n' "$string does not start with $start";;
esac

请注意,在包含通配符$start的情况下,引号是必需的。$start例如,有start='*',没有它们,$start*总是匹配。[[ $string = "$start"* ]]ksh/bash也是如此。

相关内容