这是我第一次在这里发帖,所以如果我做错了什么,非常欢迎任何反馈!我对 shell 脚本非常陌生,正在尝试编写一个函数来检查某个项目是否在列表中。在本例中,我检查给定参数是否对应于系统上的现有用户。我真的想通过确保该项目被空格包围来避免误报,但这显然排除了列表中的第一个和最后一个项目。我想也许我可以在列表的开头和结尾添加空格,但我不知道如何做到这一点。非常欢迎任何提示或指示!到目前为止我的代码来自这个帖子。它看起来像这样:
-->这是现有用户的列表
users=$(getent passwd {1000..60000} | awk -F ':' '{print $1}')
-->检查给定命令行参数是否在现有用户中的函数
contains(){
[[ $1 =~ (^|[[:space:]])"$2"($|[[:space:]]) ]] && return 0 || return 1
}
其中 $1 是使用 getent 从 passwd 文件中获取的用户列表(见上文),$2 是我试图验证的给定(命令行)参数。
正如信息:出于测试目的,我一直在尝试使用列表(1 2 3 4)包含函数。如果我针对 2 和 3 进行检查,则该方法有效,但针对 1 和 4 则无效。
答案1
尝试下面的自定义功能。它接受一个列表,其中每个项目都位于单独的行上。参见用法。
contains(){ printf "%s\n" "$1"|grep '^'"$2"'$' > /dev/null; }
返回码是 grep 命令的返回码:
- 0 - 如果在列表中找到该项目(全行匹配,区分大小写)
- 1 - 如果在列表中找不到该项目
- 2 或更高 - 如果发生错误(将打印错误消息)
您可能需要对上述函数进行修改才能使其按您想要的方式工作:
- 不打印任何内容,甚至不打印可能的错误消息:
&> /dev/null
- 打印所有内容(该项目如果存在于列表中,可能是错误消息):删除
> /dev/null
- 仅当列表中存在该项目时才打印,不打印可能的错误消息:
2> /dev/null
- 强制函数仅返回 0 或 1:
&& return 0 || return 1;
用法:
list="$(getent passwd {1000..60000}|cut -f1 -d:)"
item="USER_NAME_HERE"
#or
list="$(printf "%s\n" {1..4})"
item="1"
#then
contains "$list" "$item"
#to see the return code
echo $?
答案2
users="$(getent passwd | awk -F: '{print $1}')"
contains(){
grep -qFx "$2" <<< "$1"
}
用类似的东西测试一下:
if contains "$users" "jim"; then
echo jim is a user
else
echo jim is not a user
fi