=~您可以在条件内使用匹配运算符[[ ... ]]:
#!/bin/bash
url=https://github.com/PatrickConway/repo-name.git
if [[ $url =~ ([^/]*)\.git ]] ; then
echo "${BASH_REMATCH[1]}"
fi
Run Code Online (Sandbox Code Playgroud)
括号中的每个部分都会创建一个捕获组,可以在 BASH_REMATCH 数组中的相同位置找到相应的匹配子字符串。
[...]定义一个字符类[/]匹配由单个字符、斜杠组成的字符类^否定字符类,[^/]匹配除斜杠之外的任何内容*意思是“零次或多次”\.匹配一个点,就像.没有反斜杠匹配任何字符一样所以,它是:记住一个非斜杠的子字符串,后跟一个点和“git”。
或者也许是一个简单的参数扩展:
#!/bin/bash
url=https://github.com/PatrickConway/repo-name.git
url_without_extension=${url%.git}
name=${url_without_extension##*/}
echo $name
Run Code Online (Sandbox Code Playgroud)
%从右边删除,#从左边删除,加倍符号使匹配变得贪婪,即通配符尝试尽可能多地匹配。