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
将变量设置为该值(这里我们设置$str
为world
):
str=world
然后:
if [ -n "${str%%w*}" ]
then
echo false
else
echo true
fi
w*
积极地从 的开头删除模式$str
。w*
匹配w
后跟任意数量的字符,因此如果可能的话它将匹配整个字符串。- 如果还剩下什么,
$str
则不以 开头w
。
或者:
if [ "$str" = "${str#w}" ]
then
echo false
else
echo true
fi
w
如果可能的话,从 中删除$str
。- 与之比较
$str
。 - 如果相等(即删除没有执行任何操作),
$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也是如此。