2015-07-03 3 views
2

Я пишу вторую версию моего git-ключа post-receive.Как разбить строку на составные части в Linux Bash/Shell

У меня есть 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" 

Что такое правильный метод для приема этих элементов по одному за раз со спины строки или гарантировать, что строка из трех частей выделяет эти переменные?

Возможно, лучше разбить на массив?

ответ

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]}" 

UPDATE: альтернативное решение по anishsane:

IFS=/ read PROJECT_NAME VHOST_TYPE PROJECT_CODENAME <<< "$GL_REPO" 
+0

Я собирался ответить именно это. +1. Чисто и просто. – anishsane

+0

@anishsane: thanks :) –

+1

Альтернативно 'IFS =/читать PROJECT_NAME VHOST_TYPE PROJECT_CODENAME <<<« $ GL_REPO »' – anishsane

1

Вы можете использовать cut с разделителем полей вытаскивать детали заказа:

NAME=$(echo $GL_REPO | cut -d/-f 1) 

Вы можете повторить то же самое для других полей. Конец/ведущий слэш, который вы можете игнорировать (например, вы получите поле NAME, например, пустое), или вы можете отделить верхнюю косую черту с помощью ${GL_REPO##/} (аналогичным образом вы можете удалить конечную косую черту с помощью ${GL_REPO%%/}).

+0

Приветствую вас. Я использовал часть вашего решения в решении проблемы, чтобы убедиться, что на обоих концах удалены косые черты – Maiakaat

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]}" 

Использование Bash Pattern Matching:

GL_REPO="/project.name/vhost-type/versioncodename" 
patt="([^/]+)/([^/]+)/([^/]+)" 
[[ $GL_REPO =~ $patt ]] 
echo "PN: ${BASH_REMATCH[1]} VHT: ${BASH_REMATCH[2]} VC: ${BASH_REMATCH[3]}" 
Смежные вопросы