내 코드에 문제가 있습니다. 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
답변1
sh
귀하의 코드는 표준이 지원하지 않는 두 가지 이상을 사용합니다 .
[[ ... ]]
는 POSIX 구문의 확장으로,bash
예를 들어 자신만의 조건식을 도입하는 데 사용됩니다.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