Bash Shell脚本:使用Diff命令

时间:2014-01-28 18:07:55

标签: bash shell diff

任何人都可以帮我解决这个程序的问题吗?

#!/bin/bash

find teste1 > names.lst
find teste2 > names2.lst

result=$(diff -y -W 72 $names $names2)

if [ $? -eq 0]; then
echo "files are the same"
else
echo "files are different"
echo "$result"
fi

它返回以下错误:

diff:缺少操作数

teste.sh:[:missing']'

文件不同

(此处显示空格)

空格是变量“结果”,但为什么不保存2个文件之间的差异?

我正在尝试使用diff来找出这些文件中文本的差异。

2 个答案:

答案 0 :(得分:4)

除了区分未定义的变量$ names和$ names2而不是你创建的文件(names.lst和names2.lst)之外,还有一些语法错误:你需要一个方括号周围的空格来执行条件。

#! /bin/bash

find teste1 > names.lst
find teste1 > names2.lst

result=$(diff -y -W 72 names.lst names2.lst)

if [ $? -eq 0 ]
then
        echo "files are the same"
else
        echo "files are different"
        echo "$result"
fi

答案 1 :(得分:2)

有一些小错误......

  1. teste.sh: [: missing ']':您错过了0

  2. 之后的空格
  3. 变量$name$name2似乎未填充。

  4. 一些改进可能是:

    但是在最近的bash下执行此操作不需要编写脚本:

    result="$(diff -y <(find teste1) <(find teste2))" &&
       echo files are the same ||
       { echo files differ; echo $result; }
    

    result="$(diff -y <(find teste1) <(find teste2))" &&
       echo files are the same || printf "files differ:\n%s" "$result"
    

    这样做的一个主要优点是不需要临时文件

    当然,这可以写成正确并且更具可读性:

    #!/bin/bash
    
    files=(
        "/path1/teste 1"
        "/path2/teste 2"
    )
    
    if result="$(
        diff -y -W78 <(
            find ${files[0]}
          ) <(
            find ${files[1]}
          ) )" 
      then
        echo "Files are the sames"
      else
        echo "Files are differents"
        echo "$result"
      fi