我想编写一个简单的 Bash 脚本,当使用实际用户名作为参数时,该脚本显示用户主目录的路径,并在使用该系统上不存在的用户名时显示用户未找到或其他内容作为一个论点。
这需要一个函数吗?这可以通过在脚本文件中使用基本的 GNU 兼容命令来完成吗?
答案1
read -p "Enter a username: " username
if getent passwd "$username" > /dev/null
then
printf "Their home directory is: %s\n" "$(getent passwd "$username" | cut -d: -f6)"
else
printf "User not found!\n" >&2
fi
答案2
#!/bin/sh
username=$1
if ! getent passwd "$username" >/dev/null 2>&1; then
printf 'User %s does not exist\n' "$username"
exit 1
fi
homedir=$( getent passwd "$username" | cut -d: -f6 )
if [ -n "$homedir" ]; then
if [ -d "$homedir" ]; then
printf 'User %s has a valid (existing) home directory: %s\n' "$username" "$homedir"
else
printf 'User %s lacks a valid (existing) home directory: %s\n' "$username" "$homedir"
fi
else
printf 'User %s has no home directory\n' "$username"
fi
该脚本从命令行获取用户名:
$ ./script.sh kk
User kk has a valid (existing) home directory: /home/kk
$ ./script.sh nobody
User nobody lacks a valid (existing) home directory: /nonexistent
$ ./script.sh aoae
User aoae does not exist
答案3
getent passwd <USERNAME>
是读取用户数据库的好方法。如果用户存在,它会打印给定用户的用户数据库中的条目;如果用户不存在,则以非零值退出。
因此,我们可以查看输出是否以零退出,如果以非零退出则打印错误消息。
主目录是 passwd 条目的第 6 个字段。可以使用标准文本处理工具(例如awk
或 )来提取它cut
。
if passwd="$(getent passwd "$user")"; then
awk -F: '{print $6}' <<<"$passwd"
else
echo "No such user $user" >&2
fi