【问题标题】:Bash == not found重击 == 未找到
【发布时间】:2017-01-05 21:54:19
【问题描述】:

我有一个小的 bash 脚本:

#!/bin/bash
if [[ "$@" == "pull" ]]
then
    # stuff 
elif [[ "$@" == "push" ]]
then
   # stuff
else
    echo "Command not recognised"
fi

它位于 /usr/bin/local 中,我使它可执行。但是,每当我运行它时,我都会得到script:1: == not found

有什么想法吗?

如果重要的话,这是 macOS。

【问题讨论】:

  • # stuff 中有什么内容?你能复制并粘贴你的脚本是什么吗?
  • @melpomene:无关紧要,这是[[
  • 即使在 bash 的 [[ ]] 中,顺便说一下,使用 = 比使用 == 更好仍然 - 这样你就不会养成习惯这将导致您为其他 shell 或测试命令编写错误代码。
  • 不过,这个问题最大的问题是 您没有测试其中包含的代码来重现您所询问的相同问题 -- 如果您'已经测试过了,你会注意到不相关的语法错误(由于测试条​​件中缺少正文内容),并修复了由此重现的语法错误。
  • @AdamJarvis,不正确:复合命令(如 if)在执行任何部分之前都会被完整解析。

标签: bash if-statement string-comparison


【解决方案1】:
  1. 不要使用 POSIX 未定义的[[。而是使用[

  2. 不要使用==,使用=

  3. 不要使用$@,使用$1

  4. 在这种情况下不要对pullpush 使用双引号,事实上根本不要使用它们

  5. 当 sh 可以使用时不要使用 Bash

更新脚本:

#!/bin/sh
if [ "$1" = pull ]
then
  # stuff 
elif [ "$1" = push ]
then
 # stuff
else
  echo 'Command not recognised'
fi

【讨论】:

  • 你不知道# stuff是否不使用bash功能。
  • 完美,按预期工作。不过,我希望我知道为什么 Bash 不起作用?
  • 不能像case "$1" in pull) ...;; push) ...;; *) ...;; esac那样完成整个事情吗?
  • @melpomene:当然,这是惯用方式。
  • 虽然pullpush 周围的引号不是必需,但没有理由不建议使用它们。
【解决方案2】:

坚持使用 bash 作为您的解释器,您唯一的问题是使用 "$@",在 bash 的 [[ 和 POSIX 的 [test 等测试中,它扩展到所有用引号括起来的参数(就像"$*")。您可能希望 "$1" 仅测试第一个参数。

您也可以考虑使用case(switch)语句:

#!/bin/bash
case "$1" in
  ( pull )  echo "you said pull" ;;
  ( push )  echo "you said push" ;;
  (  *  )   echo "Command '$1' is not recognised" ;;
esac

(上面的代码可以在 bash、sh 和 zsh 中运行。由于代码的其他方面,我假设您仍然需要 bash。)

【讨论】:

  • 您能否重现或解释 OP 报告的 == not found 输出?
  • @CharlesDuffy – 不,我无法用 Bash 4.4.5、Bash 4.0.42、ksh 93u+ 或 zsh 5.3 重现。 Dash 和朋友们当然会首先抱怨 bashisms。我也对记者在无效 shebang 的情况下执行程序的能力感到困惑,也就是说我不知道​​实际使用的是什么 shell。 csh 和 tcsh 将首先抱怨一个非法的变量名(还有,don't use those!)
  • 哪里说bash没有正确安装? 脚本/usr/local/bin,但是shebang没有错。
  • 另外,"$@"扩展为 [[ 中的多个单词,因为参数扩展的单词拆分被抑制。在这里,"$@"$* 的行为相同。
  • @chepner – 有趣,我不知道。我想这就是为什么我没有看到任何错误。我已经修改了答案。
猜你喜欢
  • 2014-04-14
  • 2021-04-03
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多