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

У меня вопрос о моем коде. Я пишу сценарий 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 
  • Как скопировать все файлы, которые были созданы или изменены за последние 12 месяцев?
  • О выполнении сценария оболочки
  • Какую команду idempotent можно использовать, чтобы символическая ссылка указывала на каталог?
  • Удалить все скобки в имени файла
  • Должен ли я заботиться о ненужных кошках?
  • Выход из скрипта Bash при выходе из sudo
  • Производительность скрипта Bash
  • Описание списка пакетов
  • выбор конкретной строки в поле
  • Почему лучше использовать «#! / Usr / bin / env NAME» вместо «#! / Path / to / NAME» в качестве моего shebang?
  • Некоторые символы исчезают после обработки текстового файла
  • Linux и Unix - лучшая ОС в мире.