В этом примере я упоминаю, что у меня есть 2 списка.

list1
x;00:26:82:50:00:00;192.168.1.195;COMPUTER1
x;00:26:82:50:11:11;192.168.1.195;COMPUTER2
x;00:26:82:50:22:22;192.168.1.196;COMPUTER3

list2
x;00:26:82:50:11:11;192.168.1.197;COMPUTER3

И когда я выполняю команду (спасибо ccs242):

for field in 2 3 4; do cut -d\; -f${field} list* | sort | uniq -d; done

Я получаю дубликаты

00:26:82:50:11:11
192.168.1.195
COMPUTER3

Теперь я хочу автоматизировать этот процесс с помощью bash-скрипта, поэтому, если он не находит дубликаты, выполните определенную команду, но если скрипт обнаружит дубликаты, прервет и оставит дубликаты в /var /log /syslog

Это мой сценарий:

 pathlist=/etc/doc

 function duplicate(){
     acls=`for field in 2 3 4; do cut -d\; -f${field} $pathlist/list* | sort | uniq -d; done`
     if [ ${acls} == '' ]; then
     echo OK
     #run a command foo
 else
     echo "Duplicate Data. Abort. Check /var/log/syslog"
     echo $acls >> /var/log/syslog
     exit
  fi
 }
 duplicate

Проблема здесь:

  [ ${acls} == '' ]

Как я могу это исправить?

2 ответа2

1

Если существует более одного дубликата, то $acls будет содержать пробел для каждой новой строки, и команда будет синтаксически неверной. Что вам нужно это:-

[ "${acls}" == "" ]

Это заставляет сравнение быть между двумя строками. Как и в вашем вопросе, вы можете использовать '' вместо "" , но я предпочитаю использовать одинаковые кавычки с обеих сторон сравнения.

0

Попробуйте это так:

if [ -z ${acls} ]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .