【问题标题】:Unexpected operator error [duplicate]意外的操作员错误[重复]
【发布时间】:2011-01-01 22:35:24
【问题描述】:

我的代码有什么问题?

#!/bin/sh

LOOK_FOR="$1"

for i in `find $2 -name "*jar"`; do
  echo "Looking in $i ..."
  #jar tvf $i | grep $LOOK_FOR > /dev/null
  jar tvf "$i" | grep "$LOOK_FOR" 

  if [ $? == 0 ] ; then
    echo "==> Found \"$LOOK_FOR\" in $i"
  fi  
done #line 13

输出

wk@wk-laptop:$ sh lookjar.sh org/apache/axis/message/addressing/EndpointReference  /media/0C06E20B06E1F61C/uengine/uengine
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/build/uengine_settings.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/commons-fileupload.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/FCKeditor-2.3.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/processmanager/signedmetaworks.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/hsqldb.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/servlet.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/commons-discovery.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/google.jar ...
[: 13: 1: unexpected operator
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/jxl.jar ...

【问题讨论】:

    标签: bash jar find


    【解决方案1】:

    您需要在[ $? == 0 ] 行中使用= 而不是==

    【讨论】:

    • 为什么有什么不同?
    • @kapitanluffy Because the standard says so. 它指定了= 的作用,但== 根本没有提及,因此无效。
    • 哦,很困惑,因为我看到使用'=='而不是'='的脚本
    • == 适用于 bash 但对于 sh 我们需要使用 = 来比较两个字符串是否相等。
    • @AlexanderMills sh 与 bash 不同。 sh 是Bourne shell;它的行为在 POSIX 中指定。 bash (Bourne again shell) 是一个 GNU 项目,它提供了许多超出标准 Bourne shell 所提供的扩展。显然,其中一个扩展似乎允许人们在其 test 内置函数中使用 ==,这不是标准的,标准 Bourne shell 也不会容忍这种情况。
    【解决方案2】:

    您应该将其更改为:

    if [ $? -eq 0 ]; then
        ...
    

    -eq 进行数值比较。

    您还可以利用在 shell 中返回值 0 被视为成功这一事实,并编写如下代码:

    if jar tvf "$i" | grep "$LOOK_FOR"; then
        ...
    

    【讨论】:

    • 嗯,数字或字符串比较在这里并不重要。
    • 正是我的问题。 == 仅在 bash 中有效,但我使用的是 sh
    • sh 通常只是指向另一个解释器的符号链接。我遇到了与 OP 相同的问题,在我的 Ubuntu 安装中发现,sh 指向破折号,我认为它使用 = 来比较字符串。
    • 我还发现lbuntu使用dash作为默认shell。
    • -eq: 意外操作符
    【解决方案3】:
    #!/bin/sh
    LOOK_FOR="$1"    
    find $2 -name "*jar"`| while read -r file
      echo "Looking in $file ..."
      jar tvf "$file" | grep "$LOOK_FOR" 
      if [ $? -eq 0 ] ; then
        echo "==> Found \"$LOOK_FOR\" in $file"
      fi  
    done
    

    【讨论】:

      【解决方案4】:

      试试:

      if [[ $? == 0 ]]; then
          echo "==> Found \"$LOOK_FOR\" in $i"
      fi
      

      【讨论】:

      • 这是一种 bashism,我从发布的错误消息中知道 OP 没有使用 bash。 :-P
      • 开始,一些发行版的 /bin/sh,FWIW 有 bash。在这种情况下,我认为 bash 可以与 === 一起使用,因此 OP 很可能没有使用 bash(我认为只有 bash 支持 [[ 样式)FWIW。
      猜你喜欢
      • 2019-11-06
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多