uClinux下md5sum自动校验脚本报[: unknown operand错误求助
问题分析与解决方法
让我来帮你拆解这个问题并搞定它——你遇到的[: My_File.tar: unknown operand错误,根源在于shell脚本里的判断逻辑有语法陷阱,咱们一步步理清楚:
错误原因详解
先看你脚本里的这行关键代码:
if [ -z `md5sum "$filename.tar" | grep $md5` ]
当md5校验正确时,grep $md5会输出完整的匹配行,比如:d4deeac6f655ee5d4b9ec150fc6957a5 My_File.tar。这时候反引号会把这个输出直接替换到[命令里,导致这条命令变成:
[ -z d4deeac6f655ee5d4b9ec150fc6957a5 My_File.tar ]
而[(也就是test命令)的-z选项只接受一个参数——用来判断是否为空字符串。现在这里有两个参数(md5值和文件名),[命令会把第二个参数My_File.tar当成未知的操作数,所以就抛出了那个错误。
反过来,当校验失败时,grep没有输出,反引号替换后是空字符串,命令变成[ -z "" ],完全符合语法,所以不会报错。
两种可靠的解决方法
方法1:检查grep的退出状态(推荐)
grep命令在找到匹配时退出码是0,没找到是1,我们可以直接利用这个特性判断,不需要处理输出内容,简洁又可靠:
#!/bin/sh filename='My_File' md5='d4deeac6f655ee5d4b9ec150fc6957a5' # 修复test和!之间的空格,变量加双引号避免空格问题 if test ! -e "$filename.tar" then echo "Update file does not exist" exit 1 fi # 使用grep静默模式(-q),只返回退出状态不输出内容 if ! md5sum "$filename.tar" | grep -q "$md5" then echo 'md5sum is not correct' exit 1 else echo 'md5sum is correct' fi tar -xvf "$filename.tar" [...]
这里的!表示:如果grep没找到匹配(校验失败),就执行错误分支,逻辑清晰且没有输出干扰。
方法2:将反引号输出用引号包裹
如果你坚持要用-z的判断方式,需要把反引号的结果用双引号括起来,让它成为一个单独的字符串参数:
if [ -z "`md5sum "$filename.tar" | grep "$md5"`" ]
这样不管grep输出多少内容,都会被当成一个整体,-z就能正确判断这个字符串是否为空了。不过这种方式不如方法1高效,因为还要额外处理输出内容。
内容的提问来源于stack exchange,提问作者grorel
相关产品推荐
相关产品推荐

