2013-08-18 3 views
0

Я хочу, чтобы в скрипте bash (Linux) проверялось, если два файла идентичны. Я использую следующий код:Delimiter ", пробелы и скрипт bash в Linux

#!/bin/bash 
… 
… 
differ=$(diff $FILENAME.out_ok $FILENAME.out) 
echo "******************" 
echo $differ 
echo "******************" 
if [ $differ=="" ] 
    then 
    echo "pass" 
else 
echo "Error ! different output" 
echo $differ 
fi 

Проблема: Команда возврата

  • разн белое пространство и разорвать, если команда

выход

****************** 
82c82 < ---------------------- --- > --------------------- 
****************** 
./test.sh: line 32: [: too many arguments 
Error ! different output 

ответ

3

правильный инструмент для проверки идентичности двух файлов: cmp.

if cmp -s $FILENAME.out_ok $FILENAME.out 
then : They are the same 
else : They are different 
fi 

Или, в этом контексте:

if cmp -s $FILENAME.out_ok $FILENAME.out 
then 
    echo "pass" 
else 
    echo "Error ! different output" 
    diff $FILENAME.out_ok $FILENAME.out 
fi 

Если вы хотите использовать программу diff, то двойные кавычки вашей переменной (и использовать пробелы вокруг аргументов команды [):

if [ -z "$differ" ] 
then 
    echo "pass" 
else 
    echo "Error ! different output" 
    echo "$differ" 
fi 

Обратите внимание, что вам нужно дважды указывать эту переменную, когда вы эхо ее, чтобы гарантировать, что символы новой строки и т. Д. Сохраняются на выходе; если вы этого не сделаете, everything is mushed onto a single line.

Или используйте [[ тест:

if [[ "$differ" == "" ]] 
then 
    echo "pass" 
else 
    echo "Error ! different output" 
    echo "$differ" 
fi 

Здесь кавычки не являются строго необходимыми вокруг переменной в состоянии, но старая школа оболочки скриптеры, как я бы их там автоматически и безвредно. Грубо говоря, если переменная может содержать пробелы и пространства, она должна быть двойным. Я не вижу необходимости изучать специальный случай для команды [[, когда он отлично работает с двойными кавычками.

2

Вместо :

if [ $differ=="" ] 

Использование:

if [[ $differ == "" ]] 

Лучше использовать современные [[ и ]] вместо внешней программы /bin/[

использовать также diff -b сравнить 2 файла, а игнорируя пробелы

+1

Вы можете использовать 'дифф -b', но проблема не была белого пространства в файлах; это пробел (новые строки и т. д.) на выходе из 'diff' (которые появляются независимо от того, существует ли разница в расстоянии в файлах). Информация о 'diff -b' действительна; это просто касательно вопроса в вопросе. Кроме того, хотя есть внешняя программа '/ bin/[', все оболочки используют встроенную команду '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

+0

Согласен с тем, что весь устаревший код использует 'test или [' для возрастов, но я считаю, что хотя бы более новый код должен отдавать предпочтение использованию '[[' или '((' 'Согласовано полностью с вашими точками на' diff -b' и ваша рекомендация использовать cmp. – anubhava

+0

Я еще не дошел до точки, где я использую '[[' или '((' в предпочтении к '['; я могу получить там в конце концов, но '[' отлично работает для меня большую часть времени. '[[' имеет совпадение регулярных выражений, это новое и полезное. Оно позволяет «<' and '>» означать сравнение не перенаправлением ввода-вывода, но я никогда не пропускал это. AFAICR, используя '((' для арифметики , это только совпадение - способ тестирования условий. Как я уже сказал, я нереформированный (или полуреформированный) старый школьный программист. Я не думаю, что злоупотребление, наложенное на '' ', полностью оправданно, - это исправное пока вы относитесь к нему с уважением, которое ему следует дать. –

1

@anubhava ответ правильный, вы также можете использовать

if [ "$differ" == "" ] 
+0

Пробелы вокруг == не являются необязательными. – choroba

+0

@choroba: Чтобы получить ожидаемый результат с помощью '[', вы должны включить пробелы. Как написано без пробелов, он всегда оценивает значение true, потому что с единственным операндом '' '' проверяет, является ли строка пустой, и с символом '==' в строке, она никогда не пуста. Nitpicking - ваше основное утверждение является точным. –

+0

@JonathanLeffler: Это была моя точка зрения. Я, наверное, слишком лаконичен. – choroba