我正在编写我的post-receive git hook的第二个版本。
我有一个GL_REPO
变量符合:
/project.name/vhost-type/versioncodename
它可能有也可能没有尾随和/或前面的斜线。
我当前的代码误解了以下代码的功能,因此它清楚地将$versioncodename
复制到每个变量中:
# regex out project codename
PROJECT_NAME=${GL_REPO##*/}
echo "project codename is: $PROJECT_NAME"
# extract server target vhost-type -fix required
VHOST_TYPE=${GL_REPO##*/}
echo "server target is: $VHOST_TYPE"
# get server project - fix required
PROJECT_CODENAME=${GL_REPO##*/}
echo "server project is: $PROJECT_CODENAME"
从字符串后面一次一个地获取这些元素,或者保证三部分字符串分配这些变量的正确方法是什么?
我想分成一个数组可能会更好吗?
答案 0 :(得分:7)
#!/bin/bash
GL_REPO=/project.name/vhost-type/versioncodename
GL_REPO=${GL_REPO#/} # remove preceding slash, if any
IFS=/ read -a arr <<< "$GL_REPO"
PROJECT_NAME="${arr[0]}"
VHOST_TYPE="${arr[1]}"
PROJECT_CODENAME="${arr[2]}"
更新:anishsane的替代解决方案:
IFS=/ read PROJECT_NAME VHOST_TYPE PROJECT_CODENAME <<< "$GL_REPO"
答案 1 :(得分:2)
您可以将cut
与字段分隔符一起使用,按顺序提取项目:
NAME=$(echo $GL_REPO | cut -d / -f 1)
您可以对其他字段重复相同的操作。您可以忽略的尾随/前导斜杠(例如,您将使NAME字段为空)或者您可以使用${GL_REPO##/}
去除前导斜杠(类似地,您可以使用{去掉尾随斜杠) {1}})。
答案 2 :(得分:1)
这是另一种方式:
GL_REPO="/project.name/vhost-type/versioncodename"
GL_REPO="${GL_REPO/#\//}"
#^replace preceding slash (if any) with empty string.
IFS="/" arr=($GL_REPO)
echo "PN: ${arr[0]} VHT: ${arr[1]} VC: ${arr[2]}"
GL_REPO="/project.name/vhost-type/versioncodename"
patt="([^/]+)/([^/]+)/([^/]+)"
[[ $GL_REPO =~ $patt ]]
echo "PN: ${BASH_REMATCH[1]} VHT: ${BASH_REMATCH[2]} VC: ${BASH_REMATCH[3]}"