Как использовать «каталоги одинаковые» в условном выражении в Unix Bash Shell? - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу сравнить две директории в условной форме.

if [ rsync -ai --dry-run dir1/ dir2/ ]; then
  echo "Different!"
fi

Однако я получаю сообщение об ошибке. \

. / Test.sh: строка 44:[: слишком много аргументов

Как исправить эту ошибку и получить условное эхо в том и только в том случае, если каталоги различаются?

Обратите внимание, rsync работает как положено безусловный.

rsync -ai --dry-run dir1/ dir2/

возвращает ноль, когда dir1 и dir2 совпадают.И ненулевое значение в противном случае.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Что входит в [ ] это тестовое выражение, а не команда.Что-то вроде [ 5 -gt 4 ] или [ "foo" = "bar" ].Эта команда rsync не имеет никакого смысла как выражение, поэтому вы получаете (не очень понятную) ошибку.

Возможно захватить вывод команды с помощью "$( )" и проверить, не пусто ли этос оператором теста -n: if [ -n "$(rsync ...)" ], но на самом деле есть лучший способ.То, что идет после if, само по себе является командой.[ - действительно распространенная команда для использования там, но вы можете использовать любую команду (или конвейер, или что угодно) там.По сути, это «если эта команда выполнена успешно, то ...». Таким образом, вы можете сделать это:

if rsync -ai --dry-run dir1/ dir2/ | grep -q "."; then

Это передает вывод команды rsync в grep, ища "."(шаблон, соответствующий любому символу, т. е. есть вывод любой ), а параметр -q (тихий) запрещает печатать совпадения, просто выйдите с состоянием успеха, если есть хотя бы одно совпадение.

0 голосов
/ 08 декабря 2018

[[ -n string ]] возвращает true, если длина строки не равна нулю, поэтому вы можете сделать:

if [[ -n $(rsync -ai --dry-run dir1/ dir2/) ]]; then
  echo "Different!"
fi
...