Вот мой взгляд на этот вопрос. Использование getent
для поиска пользователя в файле /etc/passwd
Если вы просто хотите проверить, существует ли пользователь.
getent passwd "$username"
Это должно напечатать имя (и всю информацию в Поле Gecos ) пользователя, если оно существует, и возвращается с нулевым статусом 0
, что означает истину. В противном случае не ноль, см. Руководство для значения другого статуса.
Теперь, когда мы знаем эту информацию, мы можем использовать if-statement
if getent passwd "$username"; then
echo "$username found."
else
echo "$username not found." >&2
fi
Перенаправьте вывод на /dev/null
, если это не желаемый результат, или если вы только после состояния выхода / возврата теста.
if getent passwd "$username" >/dev/null; then
echo "$username found."
else
echo "$username not found." >&2
fi
Чтобы добавить это к полному Разорванный сценарий.
#!/bin/sh
check_user() {
printf '%s' "Enter user name: "
read -r user_name
case $user_name in
'') printf '%s\n' "You have not entered anything!" >&2 ##: If empty input.
return 1;;
esac
if getent passwd "$user_name" >/dev/null; then ##: getent has no -q option unfortunately.
printf '%s\n' "$user_name FOUND"
return 0
else
printf '%s\n' "$user_name NOT FOUND!" >&2
return 1
fi
}
##: Continue the loop until a match in `/etc/passwd` was given.
until check_user; do
printf 'Please try again!\n' >&2 ##: Send message to stderr and loop again.
done
Вместо перенаправления на /dev/null
вы можете сохранить вывод getent
в переменной, используя Подстановка команд и использовать это значение плюс Расширение параметра .
check_user() {
printf '%s' "Enter user name: "
read -r user_name
case $user_name in
'') printf '%s\n' "You have not entered anything!" >&2
return 1;;
esac
if user=$(getent passwd "$user_name"); then
printf '%s\n' "${user%%:*} FOUND" ##: Print only the username using P.E.
return 0
else
printf '%s\n' "${user:-"$user_name"} NOT FOUND" >&2 ##: If the value of "$user" is empty (No match found by getent)
return 1
fi
}
until check_user; do
printf 'Please try again!\n' >&2
done