как ведет себя команда diff в операторе shell

582
Yuvaraj

Я пробовал следующий код ..

if diff f1.sh f2.sh; then echo Same else echo Different fi 

Здесь .. В моем случае и f1.sh, и f2.sh являются разными файлами .. Так что, если оператор печатает другой (как и ожидалось), но как условие становится ложным, а управление меняется на оператор else ... Как это происходит .. Как условие становится ложным ..? Как эти команды diff ведут себя здесь .. Пожалуйста, объясните процесс подробно .. Заранее спасибо (извините, если мой английский слишком плохой ..)

0
look at the documentation of diff, your distribution of choice should have it in teh /usr/share/docs or equal location diff -a would do the thing and IS script-able like so: diff -a f1.sh f2.sh | cmd2 .... linuxdev2013 7 лет назад 0
Я посмотрел на документацию команды diff и прочитал о ее состоянии выхода. Я запутался с состоянием выхода и логическими значениями .... поэтому я не совсем понимаю, как это работает специально для моего случая выше ... Вот почему я здесь .. это место, чтобы узнать на .. !! но все равно получаю отрицательные голоса за вопрос :( ridiculus Yuvaraj 7 лет назад 0

1 ответ на вопрос

4
jlliagre

Это по замыслу. Если вы посмотрите diffстраницу руководства, вы увидите следующее утверждение:

Состояние выхода равно 0, если входы одинаковы, 1, если отличается, 2, если проблема.

Состояние выхода 0означает trueдля оболочки, поэтому отображается «То же». В обоих других возможных состояниях «Разное» отображается как что-либо отличное от нуля false.

ifПоведение описано в странице ручной оболочки, вот например bash:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi 
  • Список if выполнен. Если статус выхода равен нулю, тогда список казнены. В противном случае каждый список elif выполняется по очереди, и если его выход статус равен нулю, соответствующий список выполняется и команда завершается. В противном случае список else выполняется, если присутствует. Статус выхода это состояние выхода последней выполненной команды или ноль, если нет условий проверено верно.
Adding a bit to a thorough answer by @jllagre with a general tip that you may find useful. When things aren't working as expected, try to refactor your code to be as literal as possible. Meaning, instead of working towards the minimum number of characters to achieve the intended result, go the complete opposite direction. For example, you would likely have resolved this quickly had you rewritten the code like this: `diff f1.sh f2.sh >/dev/null 2>&1; ret=$?; if [ "$ret" == "0" ]; then <...stuff...>; elif [ "$ret" == "1" ]; then <...other-stuff...>; else <...error handler type stuff...>; fi` Argonauts 7 лет назад 1
Кроме того, утилита `cmp` может быть лучшим выбором для этого варианта использования; таким образом вы не получите весь diff-спам (может быть уменьшен, но не устранен, если вы не сбросите в / dev / null). `cmp -s` ничего не выводит на стандартный вывод. результат находится в возвращаемом значении и использует те же 3 значения, что и diff (0 - то же самое, 1 diff, 2 - ошибка). Argonauts 7 лет назад 1
Thanks to all .. I am new to shell script, so just got confused with exit status value and it evaluation to Boolean values.. Now i am clear .. Really thank you very much :) Yuvaraj 7 лет назад 0

Похожие вопросы