bash 正在尝试执行我的变量名,wth

Ale*_*lls 0 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"]; 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)

在脚本上方有一个注释#,它指定发生在哪一行。到底他妈发生了什么?

Sha*_*baz 5

问题是你在这里缺少一个空格:

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 等的上下文中使用ifwhile例如,你可以利用逻辑运算的类似 C 的短路属性:

$ [ "$a" = "$b" ] && echo My variables are equal
Run Code Online (Sandbox Code Playgroud)