Linux 用于比较文件和打印格式化输出的shell脚本
我正在尝试编写一个shell脚本,它将比较两个文件,如果它们之间没有差异,则表示成功,如果存在差异,则表示失败,并打印结果。以下是我目前掌握的情况:Linux 用于比较文件和打印格式化输出的shell脚本,linux,bash,shell,Linux,Bash,Shell,我正在尝试编写一个shell脚本,它将比较两个文件,如果它们之间没有差异,则表示成功,如果存在差异,则表示失败,并打印结果。以下是我目前掌握的情况: result = $(diff -u file1 file2) if [ $result = "" ]; then echo It works! else echo It does not work echo $result fi 有人知道我做错了什么吗 result=$(diff -u file1 file2) if
result = $(diff -u file1 file2)
if [ $result = "" ]; then
echo It works!
else
echo It does not work
echo $result
fi
有人知道我做错了什么吗
result=$(diff -u file1 file2)
if [ $? -eq 0 ]; then
echo "It works!"
else
echo "It does not work"
echo "$result"
fi
建议:
结果的变量赋值中“
”周围没有空格=
- 运行
后使用diff
状态变量,而不是$?
的字符串长度$result
- 我习惯于使用反勾号代替
,但是@Dennis Williamson引用了一些很好的理由来使用后者。谢谢你,丹尼斯李>$()
- 根据评论中的建议应用报价
- 将数字测试的“
”更改为“=
”-eq
结果的变量赋值中“
”周围没有空格=
- 运行
后使用diff
状态变量,而不是$?
的字符串长度$result
- 我习惯于使用反勾号代替
,但是@Dennis Williamson引用了一些很好的理由来使用后者。谢谢你,丹尼斯李>$()
- 根据评论中的建议应用报价
- 将数字测试的“
”更改为“=
”-eq
result=$(diff -u file1 file2)
if [ "$result" == "" ]; then
echo 'It works!'
else
echo It does not work
echo "$result"
fi
享受。首先,你应该将字符串与引号进行比较 第二,“!”不能用,它有另一个意思。可以用单引号将其括起来 因此,您的程序将是
result=$(diff -u file1 file2)
if [ "$result" == "" ]; then
echo 'It works!'
else
echo It does not work
echo "$result"
fi
享受。既然失败时需要结果,为什么不在脚本中简单地使用“diff-u file1 file2”?你甚至不需要脚本。如果diff成功,则不会发生任何事情,否则将打印diff。既然失败时需要结果,为什么不在脚本中简单地使用“diff-u file1 file2”?你甚至不需要脚本。如果diff成功,则不会发生任何事情,否则将打印diff。bash字符串等效为“==”。 -n是非零字符串,-z是长度为零的字符串,用引号括起来,因为如果diff的输出比具有“太多参数”的单个字符串长,则命令将发出抱怨。 所以 或
bash字符串等价为“==”。 -n是非零字符串,-z是长度为零的字符串,用引号括起来,因为如果diff的输出比具有“太多参数”的单个字符串长,则命令将发出抱怨。 所以 或
$result需要在双引号中,bash不会在单引号中计算内容,因此它实际上是在这里计算文本字符串$result。不过,它是用双引号写的。对,这是我快速输入的错误。。。我会解决这个问题。如果你使用Bash或ksh,你可以使用双括号[[],通常可以避免引用和转义,而且你可以访问更多的测试,包括正则表达式匹配:$result需要在双引号中。Bash不会在单引号中计算内容,所以它实际上是在计算文本字符串$result。不过,它是用双引号写的。对,这是我快速输入的错误。。。我会解决这个问题。如果你使用Bash或ksh,你可以使用双括号[[]],通常可以避免引用和转义,而且你可以访问更多的测试,包括正则表达式匹配:我也喜欢backticks,但这种“口味问题”可能会让你被一些狂热者否决。这比我的答案更清楚,+1+1也来自我,因为它解释了更多的事情,看起来更漂亮。但有一个问题是,如果没有转义或非进程包装(“”),就不能使用“!”。很抱歉,我颠倒了测试语法中对“
=
”和“-eq
”的解释。我已经消除了我的错误!不要使用反勾号。这不仅仅是口味的问题——嵌套命令、嵌套引用、可读性等都更好:我也喜欢反勾号,但这种“口味问题”可能会让你被一些狂热者否决。这比我的答案更清晰,因为它解释了更多东西,看起来也更漂亮。但有一个问题是,如果没有转义或非进程包装(“”),就不能使用“!”。很抱歉,我颠倒了测试语法中对“=
”和“-eq
”的解释。我已经消除了我的错误!不要使用反勾号。这不仅仅是味道的问题——嵌套命令、嵌套引用、可读性等都更好:但是当它们不同时如何输出结果?但是当它们不同时如何输出结果?
if [ -z "$(diff $1 $2)" ]; then
echo "Same"
fi