我对我的代码有疑问。我正在编写一个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
测试对于非空文件来说是正确的。
要在 shell 中手动执行此操作,请在发现重复项时设置一个标志:
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