![如何在 Bash 脚本中比较两个字符串(来自用户输入)](https://linux22.com/image/877856/%E5%A6%82%E4%BD%95%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%88%E6%9D%A5%E8%87%AA%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%EF%BC%89.png)
这是我的脚本,我知道我做错了,所以请帮助我!
#!/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
,那么它将比较两个名为和 的文件,这可能不是您想要的。test1
bar
test2
foo
bar
除此之外,还有这一行:
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
答案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)