我有一个很好的行列出所有用户帐户,但我如何判断其中一个是否不在列表中。
cat /etc/passwd | grep "/home" | cut -d: -f1
fred
barney
wilma
elroy_jetson
我不认为Elroy Jetson会在Bedrock,所以我想举起一面旗帜。 我能想到的唯一方法就是笨拙:
ALL_USERS_ARE_VALID="true"
for USER in `cat /etc/passwd | grep "/home" | cut -d: -f1`; do
if [[ "$USER" == "fred" ]]; then
#valid user
elif [[ "$USER" == "barney" ]]; then
#valid user
elif [[ "$USER" == "wilma" ]]; then
#valid user
else
ALL_USERS_ARE_VALID="false"
fi
done
必须有更好的方法......
答案 0 :(得分:2)
:> cat expectedResidents
fred
barney
wilma
:> cat /etc/passwd | grep "/home" | cut -d: -f1| fgrep -vf expectedResidents
elroy_jetson
fgrep
表示* file * grep,其中file包含您要搜索的目标。请注意,传统的fgrep仅支持精确的字符串匹配(以及-i
ignore-case)选项,因此搜索列表文件中的尾随空格等将导致问题。像往常一样使用-v
选项意味着忽略与指定模式匹配的行。 -f
告诉fgrep
要使用哪个文件。最后,对于传统的fgrep
(Sun等),搜索列表文件中有多少行可以限制,因此如果这是针对大型生产系统,则测试,测试,测试; - )
根据您的操作系统,您可能需要确定是否需要使用grep -F -vf ...
或类似内容。
我希望这会有所帮助。
答案 1 :(得分:1)
你怎么能指望电脑知道elroy不应该在基岩?如果你有一个“已知”有效帐户列表,请提供一个文件,然后grep -v
说明找不到这些帐号。
答案 2 :(得分:1)
编写链式if语句的更好方法是使用case结构,如下所示:
case "$USER" in
fred|barney|wilma)
# valid user
;;
*)
ALL_USERS_ARE_VALID="false"
esac
答案 3 :(得分:1)
不是使用多个if语句,而是将有效用户存储在文件中,然后使用comm
进行比较。
示例:
$ cat valid_users # file containing valid users
fred
barney
wilma
$ comm -23 <(cat /etc/passwd | grep "/home" | cut -d: -f1 | sort) <(sort valid_users)
elroy_jetson
答案 4 :(得分:1)
您可以使用case in
声明。
例如:
case `cat /etc/passwd | grep "/home" | cut -d: -f1` in
fred | barney | wilma )
# valid
;;
*)
echo "Unallowed user";
break;
;;
esac;