【问题标题】:bash is trying to execute my variable name, wth [duplicate]bash 正在尝试使用 [重复] 执行我的变量名
【发布时间】: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 很棒的工具!

标签: git bash github


【解决方案1】:

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

if [ ${1} == "--force" ];
    ^                 ^ (second error)

另外,您的意思可能是使用= 而不是==


bash 中的if 结构具有如下语法:

if command; ...

command 的结果告诉if 是执行 if 还是 else 部分。现在[ 是另一个命令(也称为test)。

所以,在 bash 中,如果你写:

$ [ a = b ]

这实际上是使用参数a=b] 调用的程序[(即使您实际上有一个名为[ 的可执行文件,该程序也可以在内部由bash 处理)

回顾你的问题,你正在尝试执行:

$ [${1} == "--force"]

这是带有参数==--force]的程序[${1}。显然不是你想要的!


这里还有一些其他的事情要记住。首先,引用"${1}" 是个好主意,因为如果它有空格或为空,您可能会想象它会创建一个不正确的[ 参数列表。

另一个是您不必总是在ifwhile 等上下文中使用[。例如,您可以利用逻辑运算的类 C 短路属性:

$ [ "$a" = "$b" ] && echo My variables are equal

【讨论】:

  • 也在]之前的末尾。
  • 并请引用参数扩展。
  • (旁白:你建议使用= 而不是== 是完全正确的,因为== 是一个bash/ksh 扩展并且不能保证是可移植的,而= 是POSIX 定义。感谢您指出这一点——这是一个太多人忽略的项目。
猜你喜欢
  • 2016-01-31
  • 2017-05-16
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2021-03-29
  • 2016-11-25
  • 2018-10-10
  • 2023-04-07
相关资源
最近更新 更多