Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于比较文件和打印格式化输出的shell脚本_Linux_Bash_Shell - Fatal编程技术网

Linux 用于比较文件和打印格式化输出的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

我正在尝试编写一个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 [ $? -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