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

У меня вопрос о моем коде. Я пишу сценарий 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 
  • Обратитесь к переменной цикла в аргументе
  • Каков правильный способ расширения этих строк bash в правильные команды Git?
  • Как создать имя файла для моего приложения электронной почты?
  • checkbashisms-совместимый способ определения текущей оболочки
  • Инструменты и стратегии для анализа устаревшего приложения на основе сценариев оболочки
  • Сценарий оболочки для изменения каталога терминала и открытия второго терминала
  • Удаление старых файлов в каталоге, кроме файлов, присутствующих в файле исключений
  • Можно ли запустить команду из bash и отправить ей нажатие клавиши
  • добавить имя файла в текст в углу файла изображения
  • Команда Shell для сохранения списка фильмов в csv
  • Как работает эта функция bash?
  • Использование exec в поиске поверх ssh из сценария оболочки
  • Linux и Unix - лучшая ОС в мире.