【问题标题】:IF Statement to Compare Two Files in UnixIF 语句比较 Unix 中的两个文件
【发布时间】:2013-09-25 11:13:57
【问题描述】:

我有一个 unix 脚本,它将为两个文件创建 md5sum,然后检查这两个文件是否匹配。这是脚本的一个示例 - 但这没有正确比较文件 - 任何人都可以对此有所了解吗?

md5sum version1.txt >> file1
md5sum version2.txt >> file2

if [ $file1 == $file2 ]
then
    echo "Files have the same content"
else
    echo "Files have NOT the same content"
fi

【问题讨论】:

    标签: unix if-statement scripting


    【解决方案1】:
    if [ "$(md5sum < version1.txt)" = "$(md5sum < version2.txt)" ]; then
        echo "Files have the same content"
    else
        echo "Files have NOT the same content"
    fi
    

    如果其中一个 MD5 校验和已经计算并存储在文本文件中,您可以使用

    if [ "$(md5sum < version1.txt)" = "$(awk '{print $1}' md5hash.txt)" ]; then
    ...
    

    【讨论】:

    • @MichałPolitowski 因为问题使用它,问题不在于这个具体细节,严格来说,它不是由 ksh IIRC 首次引入的 bashism。还是更正了
    • @jlliagre 这是一个不好的理由,因为== 只能与[[ 一起使用,因为它也可以在例如[ 下使用。 bash/ksh 是因为它们(过度?)宽容,但这可能(将)破坏严格遵循 POSIX 标准的其他 shell,并且不允许 == 使用单括号表示法。只是永远不要使用[ ... == ... ](即[ = ][[ == ]])来保证安全/便携,并教育他人——不要只是默默地复制他们的错误:-) +1,不过!
    • @AdrianFrühwirth 我完全同意你的看法,答案不仅适用于 OP。 dash 例如会在 == 上窒息。
    • 我喜欢这个版本——漂亮而紧凑。如果我将 MD5 检查作为文本文件提供,我该怎么做:if [ "$(md5sum &lt; version1.txt)" = "md5hash.txt" ]
    【解决方案2】:
    HASH1=`md5sum version1.txt | cut -f1 -d ' '`
    HASH2=`md5sum version2.txt | cut -f1 -d ' '`
    
    if [ "$HASH1" = "$HASH2" ]; then
        echo "Files have the same content"
    else
        echo "Files have NOT the same content"
    fi
    

    或者:

    if cmp -s version1.txt version2.txt; then
        echo "Files have the same content"
    else
        echo "Files have NOT the same content"
    fi
    

    【讨论】:

    • 这是个好主意,但您应该使用抗冲突的哈希函数。在 MD5 中,您可以“轻松”找到两个具有相同哈希但内容不同的文件。考虑改用 SHA-256 或其他更安全的哈希函数。
    • 使用cmp 作为更直接的解决方案可能会更好。
    【解决方案3】:
    if [ "$file1" == "$file2" ]
    then
        echo "Files have the same content"
    else
        echo "Files have NOT the same content"
    fi
    

    【讨论】:

    • 这完全是错误的,你没有比较那里的内容。在这种情况下,仅添加引号并不能解决根本问题。
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多