如何比较shell脚本中的两个文件?

这是我的情况。 我有两个文件有logging,每个logging的3-25个字符是一个标识符。 基于这个,我需要比较它们两个,如果它们的标识符匹配,用新的文件数据更新旧文件。 标识符以01开头。请看下面的脚本。 这是一个错误,因为“我不能理解的第12行的预期。

#!/bin/ksh while read line do c=`echo $line|grep '^01' ` if [ $c -ne NULL ]; then var=`echo $line|cut -c 3-25` fi while read i do d=`echo $i|grep '^01' ` if [ $d -ne NULL ]; then var1=`echo $i|cut -c 3-25` if [ $var -eq $var1 ]; then $line=$i fi fi done < test_monday done < test_sunday 

请提前帮助我

我认为你需要的是:

 if [ "$d" != NULL ]; 

尝试。

除非你正在编写一个脚本来移植到原来的Bourne shell或其他不支持该功能的脚本,否则在Bash和ksh中你应该使用[[字符串和文件的测试形式 。

对引用和转义的需求减少,模式和正则表达式匹配等附加条件以及使用&&||的能力 而不是-a-o

 if [[ $var == $var1 ]] 

而且,“NULL”在Bash和ksh中不是特殊的值,所以你的测试总是会成功的,因为$d是针对字符串“NULL”进行测试的。

 if [[ $d != "" ]] 

要么

 if [[ $d ]] 

对于数值(不包括前导零,除非使用八进制),您可以使用数字表达式。 您可以在此上下文中省略变量的美元符号。

 numval=41 if ((++numval >= 42)) # increment then test then echo "don't panic" fi 

没有必要为子串使用echocut 。 在Bash和ksh中你可以这样做:

 var=${line:3:23} 

注意: cut使用字符位置作为范围的开始和结束,而这个shell构造使用起始位置和字符计数,所以你必须相应地调整数字。

避免使用反引号是一个好主意。 用$()代替。 这可以嵌套,引用和转义减少或更容易。

我想你可以使用DIFF命令

 diff file1 file2 > whats_the_diff.txt