github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/servant/job/util.go (about)

     1  // Copyright 2015 unirita Inc.
     2  // Created 2015/04/10 shanxia
     3  
     4  package job
     5  
     6  import (
     7  	"fmt"
     8  	"regexp"
     9  	"strings"
    10  )
    11  
    12  // 引数のセパレータ用正規表現オブジェクト
    13  var paramRegex = readyRegex()
    14  
    15  // 正規表現オブジェクトの生成
    16  // 引数は半角スペースで分割するが、二重引用符で括られている半角スペースは分割に使用しない。
    17  // 例: xxx.exe A "B C D" E F" G"
    18  //   arg[1] = "A"
    19  //   arg[2] = "B C D"
    20  //   arg[3] = "E"
    21  //   arg[4] = "F\" G\""
    22  func readyRegex() *regexp.Regexp {
    23  	return regexp.MustCompile("((\"[^\"]*\")|[^ ])((\"[^\"]*\")*[^ ]?)*")
    24  }
    25  
    26  // ジョブの実行時引数を分割する。
    27  // 両端が二重引用符の場合は、引用符を除外する。
    28  func paramSplit(params string) []string {
    29  	var p []string
    30  	b := paramRegex.FindAll([]byte(params), -1)
    31  	for i := 0; i < len(b); i++ {
    32  		tmp := fmt.Sprintf("%s", b[i])
    33  		if tmp[0] == '"' && tmp[len(tmp)-1] == '"' {
    34  			tmp = tmp[1 : len(tmp)-1]
    35  		}
    36  		p = append(p, tmp)
    37  	}
    38  	return p
    39  }
    40  
    41  // 実行ファイル内に半角スペースが存在する場合に、二重引用符で括る
    42  func shellFormat(shell string) string {
    43  	rc := shell
    44  	if sep := strings.IndexRune(shell, ' '); sep != -1 {
    45  		rc = "\"" + shell + "\""
    46  	}
    47  	return rc
    48  }