我正在编写这个脚本,以帮助我的团队压缩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
我看到的问题是,如果我像这样执行上述脚本:
./script.sh $(git rev-parse --abbrev-ref HEAD)
然后bash尝试实际执行由$(git rev-parse --abbrev-ref HEAD)
的值表示的命令(这是当前的分支名称)。
所以换句话说,如果输出$(git rev-parse --abbrev-ref HEAD) is "xyz_branch"
,那么bash会尝试运行$ xyz_branch,而bash会吐出来:
[xyz_branch: command not found
在脚本上方有一个注释#,用于指定发生这种情况的行。到底是怎么回事?
答案 0 :(得分:4)
问题是你在这里错过了一个空格:
if [ ${1} == "--force" ];
^ ^ (second error)
此外,您可能需要使用=
代替==
。
bash中的if
构造具有如下语法:
if command; ...
command
的结果告诉if
是否执行if或else部分。现在[
是另一个命令(也称为test
)。
所以,在bash,如果你写:
$ [ a = b ]
这实际上是使用参数[
,a
,=
和b
调用的程序]
(该程序可以由bash内部处理,甚至如果您确实有一个名为[
)的可执行文件
回顾你的问题,你正试图执行:
$ [${1} == "--force"]
这是包含参数[${1}
和==
的计划--force]
。显然不是你想要的!
在这里要记住其他几件事。首先,引用"${1}"
是一个好主意,因为如果它有空格或为空,正如您可能想象的那样会为[
创建一个不正确的参数列表。
另一个原因是您不必总是在[
,if
等的上下文中使用while
。例如,您可以利用类似C的短语逻辑运算的电路特性:
$ [ "$a" = "$b" ] && echo My variables are equal