如何在 Bash 脚本中比较两个字符串(来自用户输入)

如何在 Bash 脚本中比较两个字符串(来自用户输入)

这是我的脚本,我知道我做错了,所以请帮助我!

#!/bin/bash
# Description of the script

echo "Enter first word "
read test1
echo "Enter second word "
read test2

cmp $test1 $test2 > error

total=`wc -c error | cut -f 7 -d " "`
echo $total

if [ $total -eq 0 ]
then
        echo "Both words contents are same"else
        echo "Both words contents are not same"
fi

答案1

除非你使用cmp,你可以使用[ ]它来进行比较:

if [ "$test1" = "$test2" ]
then
        echo "Both words contents are same"
else
        echo "Both words contents are not same"
fi

cmp比较文件。例如,如果您输入了和foo,那么它将比较两个名为和 的文件,这可能不是您想要的。test1bartest2foobar

除此之外,还有这一行:

echo "Both words contents are same"else

是相同的:

echo "Both words contents are sameelse"

您应该将其放在else不同的行上,或者在;其前面加上:

echo "Both words contents are same"
else
# or
echo "Both words contents are same"; else

答案2

为什么要使用 cmp?您已经在使用bash 条件稍后在脚本中,您可以换出 cmp。条件示例:

if [ "$test1" != "$test2" ]; then
     # not equal
else
     # equal
fi

Bash 中的其他比较运算符。

答案3

除了使用cmp比较字符串(仅比较文件)的错误之外,您还遇到了一些问题,即您实际上是在计算错误消息的长度cmp,并从 的输出中提取文件名(而不是字符数)wc。如果没有临时文件,整个计算会更加优雅;如果您确实使用了临时文件,则应在使用后将其清除。

如果您真的想查看两个字符串之间的差异量,也许可以将它们传递给wdiff

以下是重构后的版本:

#!/bin/bash
# Note absence of boilerplate comment

read -p "Enter first word: " test1   # Note use of read -p
read -p "Enter second word: " test2

# Note use of wdiff
# Note proper quoting of strings!  This is important
if report=$(wdiff -s123 <(echo "$test1") <(echo "$test2")); then
    echo "Strings are equal"
else
    echo "Strings differ"
    echo "$report"
fi

另外,使用 的一个基本习惯用法wc是将输入重定向到其中;然后,它不会打印文件名,因此您不必对其进行后处理。而且,这也消除了对临时文件的需要。

total=$(cmp one two | wc -c)

相关内容