Seu código usa pelo menos duas coisas que o padrão sh
não suporta:
-
[[ ... ]]
, esta é uma extensão da gramática POSIX que, por exemplo,bash
usa para introduzir suas próprias expressões condicionais. -
user=( $line )
, isso cria uma matriz, que é outra extensão do POSIXsh
.
Para encontrar as linhas duplicadas em um arquivo de texto:
sort file | uniq -d
sort
classificará o arquivo de entrada e uniq -d
somente exibirá linhas que ocorrerão várias vezes sucessivamente.
Para usar isso na saída de who
e apenas se preocupe com a coluna do usuário (a primeira coluna):
who | awk '{ print $1 }' | sort | uniq -d
Usando isso em um script:
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
O teste -s
será verdadeiro para um arquivo não vazio.
Para fazer isso manualmente no shell, defina um sinalizador quando você encontrar uma duplicata:
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