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

cjr*_*oss 5 unix git bash shell 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
}
Run Code Online (Sandbox Code Playgroud)

错误:

username@COMPUTER-NAME /path/to/local/repo
$ initg gh username bash_test desc
sh: [: missing `]'
sh: [: missing `]'
Enter host password for user 'username':
Run Code Online (Sandbox Code Playgroud)

我的问题:

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

小智 11

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

if [ "$#" -ne 2]; then
Run Code Online (Sandbox Code Playgroud)

代替

if [ "$#" -ne 2 ]; then
Run Code Online (Sandbox Code Playgroud)

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


cjr*_*oss 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':
Run Code Online (Sandbox Code Playgroud)

问题:

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

DATA='{"name":"$3", "description": "$4"}'
Run Code Online (Sandbox Code Playgroud)

此外,逗号和第二个分号后面的空格奇怪地用单引号括起来,将字符串分成几部分,这在导致失败的 curl 调用中可见。

解决

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

DATA="{\"name\":\"${3}\",\"description\":\"${4}\"}"
Run Code Online (Sandbox Code Playgroud)

后脚本

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