bash shell脚本错误sh:[:缺少`]'

时间:2013-04-06 09:18:09

标签: git bash shell unix bitbucket

目的:

我正在尝试创建一个有用的快捷方式,用于在本地初始化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 个答案:

答案 0 :(得分:9)

我有这样的错误,因为我之前没有使用空格] ex:

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

而不是

if [ "$#" -ne 2 ]; then
PS:我知道这是一个老问题,但它可能对某人有所帮助:)

答案 1 :(得分:3)

更新/临时答案

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

<强>调试

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

这在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"}'

逗号和第二个分号后面的空格奇怪地用单引号括起来,将字符串分成几个部分,在结果失败的卷曲调用中可见。

解决

除了使用[[ ]]双方括号而不是原始的单数方括号外,我只是用${3}等大括号包装每个插值变量,并修复了DATA中引号和空格的使用变量赋值(下):

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

发布脚本

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

printf -vDATA '{"name":"%s", "description": "%s"}' $3 $4
echo "$DATA"