6

目标:

我正在尝试创建一个有用的快捷方式来在本地初始化 git repo,同时在 bitbucket 或 github 上创建远程 repo 源。此功能已添加到我.bashrc的主目录中的文件中。

这是 bash 函数(会产生错误):

function initg() {
 # Defaults to bitbucket API
 local API="https://api.bitbucket.org/1.0/repositories/"
 local DATA="name=$3&description=$4&is_private=true&scm=git"
 local REMOTE="ssh://git@bitbucket.org/$2/$3"

 # Use github if specified
 if [ "$1" == "gh" ]; then
      API="https://api.github.com/user/repos"
      DATA='{"name":"$3", "description": "$4"}'
      REMOTE="git@github.com:$2/$3"
 fi

 if [ -z "$API" ] || [ -z "$DATA" ] || [ -z "$REMOTE" ] || [ -z "$2" ]
 then
      echo "A parameter is missing or incorrect"
 else
      curl -X POST -u $2 ${API} -d ${DATA}
      git init
      git add .
      git commit -m "Created repo"
      git remote add origin $REMOTE
      git push -u origin master
 fi
}

错误:

username@COMPUTER-NAME /path/to/local/repo
$ initg gh username bash_test desc
sh: [: missing `]'
sh: [: missing `]'
Enter host password for user 'username':

我的问题:

首先,我的错误在哪里?其次,我如何改进该脚本的控制流程或结构以实现既定目标?

4

4 回答 4

30

我遇到了这种错误,因为我之前没有使用空格 ] 例如:

if [ "$#" -ne 2]; then

代替

if [ "$#" -ne 2 ]; then

PS:我知道这是一个老问题,但它可能会对某人有所帮助:)

于 2016-08-18T11:55:21.223 回答
4

我已经多次从 bash 中遇到过这样的废话(一个错误?),而出路是[ some-condition ]test some-condition

于 2013-04-07T03:20:45.377 回答
3

更新/临时答案

好的,严格来说,这不是一个(知情的)答案,但是我已经设法解决了这个问题。

调试

bash -x test.sh我使用devnull 在原始帖子的评论中建议的命令在单独的专用脚本文件中运行了函数和命令。

这在 shell 中产生了相当多的反馈。在我放弃之前,这是我认为最关键的反馈。

username@COMPUTERNAME /d/test
$ bash -x test.sh
+ initg gh username bash_test desc
+ local API=https://api.bitbucket.org/1.0/repositories/
+ local 'DATA=name=bash_test&description=desc&is_private=true&scm=git'
+ local REMOTE=ssh://git@bitbucket.org/username/bash_test
+ '[' gh == gh ']'
+ API=https://api.github.com/user/repos
+ DATA='{"name":"$3", "description": "$4"}'
+ REMOTE=git@github.com:username/bash_test
+ '[' -z https://api.github.com/user/repos ']'
+ '[' -z '{"name":"$3", "description": "$4"}' ']'
+ '[' -z git@github.com:username/bash_test ']'
+ '[' -z username ']'
+ curl -X POST -u username https://api.github.com/user/repos -d '{"name":"$3",' '"description":' '"$4"}'
+ Enter host password for user 'username':

问题:

所以问题似乎在于设置了 DATA 的变量表达式(如下)。首先,传递给脚本的参数被引用$3并且$4不能被插入到单引号字符串中。

DATA='{"name":"$3", "description": "$4"}'

此外,逗号和第二个分号后面的空格奇怪地包裹在单引号中,将字符串分成几部分,在结果失败的 curl 调用中可见。

解析度

因此,除了使用[[ ]]双方括号而不是原始的单数方括号之外,我只是用花括号将每个插值变量包裹起来,${3}并修复了在 DATA 变量赋值中使用引号和空格(如下):

DATA="{\"name\":\"${3}\",\"description\":\"${4}\"}"

发布脚本

我可以改进这个答案,如果有人可以扩展这个答案,那就太好了。我很困惑为什么$DATAcurl 调用中使用的变量解析为'{"name":"$3",' '"description":' '"$4"}'

于 2013-04-06T12:48:53.473 回答
0

要提供DATA变量,请尝试以下操作:

printf -vDATA '{"name":"%s", "description": "%s"}' $3 $4
echo "$DATA"
于 2013-04-06T13:25:33.837 回答