【问题标题】:Why am i getting an unexpected operator error in bash string equality test? [duplicate]为什么在 bash 字符串相等性测试中出现意外的运算符错误? [复制]
【发布时间】:2013-08-08 18:35:23
【问题描述】:

第四行的错误在哪里?

if [ $bn == README ]; then

如果我把它写成,我仍然会得到它

if [ $bn == README ]
then

if [ "$bn" == "README" ]; then

上下文:

for fi in  /etc/uwsgi/apps-available/* 
do 
        bn=`basename $fi .ini`
        if [ $bn == "README" ]
        then
                echo "~ ***#*** ~"
        else
                echo "## Shortend for convience ##"
        fi
done

【问题讨论】:

  • 我尝试在原始脚本中进行更改,但仍然出现错误。我做了很多测试。如果我设置 rme=README 然后在简单测试中在一个或两个站点上使用引号然后执行例如 [ $rme==README ] && echo "equal";输出相等。空格在哪里确实很重要 - 当然有 [ 但如果你在 == 的一侧放置空格,它们必须在另一侧。 (我知道 bash。)我编辑了分号,以防万一我有一个杂散,并且没有修复或更改错误行。
  • 请更新您的问题,代码给出了新的错误。我在测试目录中触摸了一个 README 文件,您的代码与我之前对 if [ $bn == "README" ] 的建议一致。
  • @fedorqui 没有更多的引号,不。如果您想符合 POSIX,请使用 = 而不是 ==
  • 您在其他地方也需要更多报价。例如:bn=$(basename "$fi")$fi 周围的引号(与所有扩展一样)是强制性的。
  • 修复错误后仍然无法正常工作并不意味着不需要修复错误。无论如何 - 使用set -x 找出出错的第一个位置。

标签: bash


【解决方案1】:

将以下内容添加到脚本的顶部:

#! /bin/bash

在 bash 中,== is the same 在单括号内使用时为 =。但是,这不是便携式的。因此,您应该通过将 #! /bin/bash 放在脚本顶部来明确告诉 shell 使用 bash 作为脚本的解释器。

或者,使用= 进行字符串比较。请注意,== 运算符在双括号内的行为与在单括号内的行为不同(请参阅链接)。

【讨论】:

    【解决方案2】:

    您不能将 == 用于单括号比较 ([ ])。请改用单个 =。此外,您必须引用变量以防止扩展。

    if [ "$bn" = README ]; then
    

    如果您使用 [[ ]],这可能适用,并且您不需要引用第一个参数:

    if [[ $bn == README ]]; then
    

    【讨论】:

    • Xmm... 在 bash 3.2.25 上,== 使用 [ ... ] 语法。也许这是特定于版本的东西。
    • @user000001 在 bash 上,是的,== 可以工作,但它是一个扩展——POSIX 标准不需要它工作,所以你正在编写代码无缘无故不便携。
    • 关于便携性的好建议!并且..这并没有完全按照预期的方式解决它。但是谈话让我意识到。我很惭愧地说......不使用 bash - 错误。我以为我是,但不是。我默认使用 sh 。我忘记了#!/bin/bash 行并且没有使用 bash 脚本名来运行它。添加 #!/bin/bash 解决了这个问题。
    • @JohnHall 如果您不打算使用 [[ ]],引用变量仍然是个好主意。例如,试试这个,你会得到一个错误:A='a b c'; [ $A == . ] && echo a
    • 好的。我也在其他编程语言中使用“fi”,但它不是 bash 的一个很好的选择!我解决了这个问题,有点惊讶它的工作原理。
    猜你喜欢
    • 2012-09-08
    • 2021-05-25
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多