6

標的:

git リポジトリをローカルで初期化し、同時に bitbucket または github でリモート リポジトリのオリジンを作成するための便利なショートカットを作成しようとしています。この関数は.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

4

私は bash からこのようなナンセンスに何度か遭遇しました (バグ?) [ some-condition ]test some-condition

于 2013-04-07T03:20:45.377 に答える
3

更新・仮回答

これは厳密に言えば(情報に基づいた)回答ではありませんが、問題を解決することができました。

デバッグ

bash -x test.sh元の投稿のコメントで devnull によって提案されたコマンドを使用して、関数とコマンドを別の専用スクリプト ファイルで実行しました。

これにより、シェルでかなり多くのフィードバックが得られました。これは、中止する前に、最も重要なフィードバックであると私が信じているものです。

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

また、コンマと 2 番目のセミコロンの後のスペースが一重引用符で奇妙にラップされ、文字列がいくつかの部分に分割され、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 に答える