【发布时间】:2017-03-15 04:59:13
【问题描述】:
我正在编写这个脚本来帮助我的团队将 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
在 in 脚本上方有一个注释 # 指定发生这种情况的行。到底是怎么回事?
【问题讨论】:
-
您在
[和${1}之间缺少一个空格。 -
shellcheck.net 是你的朋友。
-
...就如何考虑而言:
[是一个命令。磁盘上实际上有一个/usr/bin/[(或/bin/[,取决于您的操作系统),尽管出于性能原因,大多数shell 也提供了一个内置版本。因此,与任何其他命令一样,您需要在命令名称及其参数之间留有空格。你不能运行lsmydir/而不是ls mydir/;[也是如此。 -
@CharlesDuffy 很棒的工具!