bash试图执行我的变量名称,

时间:2016-11-02 00:06:21

标签: 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

我看到的问题是,如果我像这样执行上述脚本:

./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

在脚本上方有一个注释#,用于指定发生这种情况的行。到底是怎么回事?

1 个答案:

答案 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