проверить дубликат входа в файл

У меня вопрос о моем коде. Я пишу сценарий Bourne shell который получает список пользователей с сервера, who затем отправляет его в файл, он проверяет имя по read line и если скрипт нашел дублирующее имя, он выведет сообщение с предупреждением имя пользователя, иначе оно будет распечатывать, что дублирование не найдено. Все работает так, как нужно, когда скрипт обнаружил дублирующее имя, но когда скрипт не может найти дублирующее имя, он ничего не напечатает, я знаю, что это связано с последним if но я стараюсь так много решений, но все же застрял , Если у кого-нибудь есть предложение, пожалуйста, помогите мне. Очень ценю и отвечаю заранее. (см. код ниже)

  #!/bin/sh #who -u | sort -k1,5 > test3 log=~/Desktop/test3 while [ -f test ]; do while IFS= read line; do user=( $line ) if [ "$olduser" = "${user[0]}" ]; then printf '\nThe user %s duplicated' "$olduser" fi olduser="${user[0]}" done<"$log" if [[ "$olduser" != "${user[0]}" ]]; then printf '\nNo duplication found.\n'; fi #Testing store value #printf '\nolduser value = %s\n' "$olduser" printf '\n=================================================================\n' sleep 3 done 

One Solution collect form web for “проверить дубликат входа в файл”

В вашем коде используются как минимум две вещи, которые стандарт sh не поддерживает:

  1. [[ ... ]] , это расширение грамматики POSIX, которое, например, bash использует для представления своих условных выражений.

  2. user=( $line ) , это создает массив, который является еще одним расширением для POSIX sh .


Чтобы найти дублированные строки в текстовом файле:

 sort file | uniq -d 

sort будет сортировать входной файл, а uniq -d будет выводить только строки, которые происходят несколько раз подряд.

Чтобы использовать это на выходе, who и только заботится о столбце пользователя (первый столбец):

 who | awk '{ print $1 }' | sort | uniq -d 

Используя это в скрипте:

 who | awk '{ print $1 }' | sort | uniq -d >duplicates.txt if [ -s duplicates.txt ]; then echo 'The following dupes were found:' cat duplicates.txt else echo 'No dupes' fi 

Тест -s будет верен для непустого файла.


Чтобы сделать это вручную в оболочке, установите флаг, когда вы нашли дубликат:

 dupe=0 who | awk '{ print $1 }' | sort -o users.txt while IFS= read -r user; do if [ -n "$prev_user" ] && [ "$user" = "$prev_user" ]; then printf 'Duplication for "%s"\n' "$user" dupe=1 fi prev_user=$user done <users.txt if [ "$dupe" -ne 1 ]; then echo 'No dupes' fi 
  • Фильтрация элементов из массива на основе ввода с помощью шаблона
  • При обработке входных файлов происходит копирование / обновление и переименование действительного подхода?
  • Использование grep с шаблоном, который содержит переменную, подлежащую расширению
  • Есть ли простой способ сделать эквивалент `sed ...` заменяя одну и ту же строку несколькими значениями?
  • Как я могу удалить все до шаблона и всего после другого шаблона из строки?
  • Мониторинг файловой системы с использованием файла конфигурации
  • Источник только часть скрипта из другого скрипта?
  • Передача параметра одиночной кавычки
  • Лучший способ запуска одиночного цикла вместо двух для циклов
  • Могу ли я изменить способ отображения параметров выбора?
  • Для цикла работает, но петли дважды
  • Linux и Unix - лучшая ОС в мире.