Git bash正在尝试执行我的变量名wth
我编写了这个脚本,以帮助我的团队将Git提交到远程服务器上的集成分支中。不用说,我的bash脚本有点欠缺 首先,这里是脚本:Git bash正在尝试执行我的变量名wth,git,bash,github,Git,Bash,Github,我编写了这个脚本,以帮助我的团队将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"
#!/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)的输出是“xyz_branch”
,那么bash将尝试运行$xyz_branch,bash将抛出:
[xyz_branch: command not found
在in脚本的上方有一条注释#,它指定了这发生在哪一行。到底发生了什么事?问题是您缺少一个空格:
if [ ${1} == "--force" ];
^ ^ (second error)
此外,您可能打算使用=
而不是=
bash中的
if
构造具有如下语法:
if 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
问题是您在此处缺少一个空格:
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
你在[
和${1}
之间缺少了一个空格。你是你的朋友吗……就如何看待它而言:[
是一个命令。实际上有一个/usr/bin/[
(或者/bin/[
,取决于你的操作系统)在磁盘上,尽管出于性能原因,大多数shell也提供内置版本。因此,与任何其他命令一样,命令名与其参数之间需要空格。不能运行lsmydir/
而不是ls mydir/
;[
@CharlesDuffy真棒的工具!你在[
和${1}
之间缺少了一个空格。你是你的朋友吗……就如何看待它而言:[
是一个命令。实际上有一个/usr/bin/[
(或者/bin/[/code>,取决于你的操作系统)在磁盘上,尽管出于性能原因,大多数shell也提供内置版本。因此,与任何其他命令一样,命令名与其参数之间需要空格。不能运行lsmydir/
而不是ls mydir/
;[
@CharlesDuffy awesome tool!同样在]前面的末尾。
。请引用参数展开式。(旁白:您建议使用=
而不是=
,这是完全正确的,因为=
是一个bash/ksh扩展,不保证可移植,而=
是POSIX定义的。感谢您指出这一点——这是一个太多人忽视的项目)。同样在之前的结尾处)
。请引用参数扩展。(旁白:您建议使用=
而不是=
,这是完全正确的,因为=
是bash/ksh扩展,不保证可移植,而=
是POSIX定义的。感谢您指出这一点——这是一个太多人忽视的项目)。