尝试检查列表是否包含 bash/unix 中的项目而不验证子字符串,但包括第一个和最后一个项目

尝试检查列表是否包含 bash/unix 中的项目而不验证子字符串,但包括第一个和最后一个项目

这是我第一次在这里发帖,所以如果我做错了什么,非常欢迎任何反馈!我对 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

相关内容