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

Ste*_*nny 4 shell test

JavaScript 有一个函数:

'world'.startsWith('w')
true
Run Code Online (Sandbox Code Playgroud)

我怎样才能用shell测试这个?我有这个代码:

if [ world = w ]
then
  echo true
else
  echo false
fi
Run Code Online (Sandbox Code Playgroud)

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

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

gle*_*man 11

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

if [[ world == w* ]]; then
    echo true
else
    echo false
fi
Run Code Online (Sandbox Code Playgroud)

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

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

case "world" in
    w*) echo true ;;
    *)  echo false ;;
esac
Run Code Online (Sandbox Code Playgroud)

[*],但你必须要小心使用A && B || C,因为形式C如果将被执行或者A出现故障B出现故障。如果 A 失败,该if A; then B; else C; fi表单只会执行 C。


Ste*_*nny 5

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

str=world
Run Code Online (Sandbox Code Playgroud)

然后:

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

或者:

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