我正在编写这个脚本来帮助我的团队将 Git 提交压缩到远程的集成分支中。不用说我的 bash 脚本有点不足。
首先,这是脚本:
#!/usr/bin/env bash
FEATURE_BRANCH_NAME="$1" &&
if [ -z "$1" ]; then
echo "You did not specify a branch name."
exit 1;
fi
if [${1} == "--force"]; then # the problem seems to happen here!
echo "You did not specify a branch name."
exit 1;
fi
if [ "$2" != "--force" ]; then
echo "Are you sure you want to squash commits for branch name = $FEATURE_BRANCH_NAME? If so use --force."
exit 1;
fi
git fetch origin &&
git checkout -b temp_branch origin/integration &&
git merge -Xtheirs --squash -m "squashed with branch=$FEATURE_BRANCH_NAME" $FEATURE_BRANCH_NAME &&
git checkout $FEATURE_BRANCH_NAME &&
git merge temp_branch &&
git push origin $FEATURE_BRANCH_NAME
#end
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,如果我像这样执行上面的脚本:
./script.sh $(git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)
$(git rev-parse --abbrev-ref HEAD)然后 bash 尝试实际执行由 , (当前分支名称)的值表示的命令。
所以换句话来说,如果输出$(git rev-parse --abbrev-ref HEAD) is "xyz_branch",那么 bash 将尝试运行 $ xyz_branch,并且 bash 将吐出:
[xyz_branch: command not found
Run Code Online (Sandbox Code Playgroud)
在脚本上方有一个注释#,它指定发生在哪一行。到底他妈发生了什么?
问题是你在这里缺少一个空格:
if [ ${1} == "--force" ];
^ ^ (second error)
Run Code Online (Sandbox Code Playgroud)
另外,您可能想使用=而不是==.
bash 中的构造if具有如下语法:
if command; ...
Run Code Online (Sandbox Code Playgroud)
其结果command告诉我们if是执行 if 还是 else 部分。现在[是另一个命令(也称为test)。
所以,在 bash 中,如果你写:
$ [ a = b ]
Run Code Online (Sandbox Code Playgroud)
[这实际上是使用参数a、=和b调用的程序](该程序可以由 bash 内部处理,即使您实际上有一个名为 的可执行文件[)
回顾你的问题,你正在尝试执行:
$ [${1} == "--force"]
Run Code Online (Sandbox Code Playgroud)
[${1}这是带有参数==和 的程序--force]。显然不是你想要的!
这里还有一些需要记住的事情。首先,引用是个好主意"${1}",因为如果它有空格或为空,正如您可能想象的那样,它将创建一个不正确的参数列表[。
另一个是你不必总是[在 an 等的上下文中使用if。while例如,你可以利用逻辑运算的类似 C 的短路属性:
$ [ "$a" = "$b" ] && echo My variables are equal
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |