【问题标题】:ShellScript 1: [: [: unexpected operatorShellScript 1:[:[:意外运算符
【发布时间】:2014-10-06 21:29:37
【问题描述】:

我遇到了无法解决的问题。这可能是一些语法问题,我已经尝试了很多解决方案但没有弄清楚问题..

我尝试使用括号.. 没有括号,但我仍然在控制台上收到此错误:

1: [: [: unexpected operator

有人可以帮帮我吗? 这是我的代码:

if [ [ cmp --silent 1.fsa 1_.fsa ] returns any ]; then
  echo "Files are different!"
else
 echo "Files are identical!"
fi

顺便说一句,我试图比较 ShellScript 中的两个文件,如果它们相同,我想说: “文件一模一样!” 否则我想说:“文件不一样!”

提前非常感谢!

【问题讨论】:

标签: linux file shell text compare


【解决方案1】:

根本不要使用括号。

if cmp -s 1.fsa 1_.fsa; then
  echo "Files are identical!"
else
  echo "Files are different!"
fi

[ ] 运行一个名为test 的命令。如果您阅读man test,您会发现它根本不理解“返回任何”的含义;它也不希望看到[ 传递给它。

所以,你得到的字面错误:

[: [: unexpected operator

表示[ 命令(又名测试)抱怨它不希望将[ 作为参数传递。

【讨论】:

  • 谢谢老兄,现在我明白了 ;) 谢谢你,真的很感激 ;) 我是 SH 的新手,哈哈
【解决方案2】:

我找到了这个解决方案:

if diff file1 file2 >/dev/null ; then
  echo Same
else
  echo Different
fi

但是有人可以说我的实现有什么问题吗? 谢谢;)

【讨论】:

  • 使用cmp更快,更节省内存;使用diff 可能有效,但绝不是正确的做法。
  • 好的,我会你的其他实现,顺便感谢你对性能的反馈;)
  • 要了解 为什么 性能不同,顺便说一下 -- cmp -s 不需要计算 如何 事情不同,所以一旦发现任何差异,它就可以立即退出。 (如果文件大小不同,它根本不需要在内容中查找不匹配的内容,并且可以立即在那里短路)。最坏的情况是读取两个文件,O(2n)。相比之下,diff 需要实际读取两个文件并计算将一个文件转换为另一个文件的最短距离路径——如果内存服务,该算法在 O(n^3) 附近的某处具有最坏情况行为.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多