Я новичок в Linux/Unix. Вот мое задание, оно слишком длинное, чтобы все здесь выкладывать:https://i.stack.imgur.com/v2AJR.jpg
Вот логика, которая у меня есть.:
Этот код проверит, ввел ли пользователь аргумент или нет. Я не знаю, что поместить под else. Мы никогда не говорили об операторе which, о котором я узнал от другого пользователя, поэтому его использование не ожидается. Просто базовые команды, это не супер-продвинутое задание.
if [ $# -ne 1 ]; then
echo Please enter a single, valid user id:
read userid
else
userid=$1
**what goes here?**
fi
Для отображения полного имени пользователя (например, Бен Франклин) я написал и протестировал следующий код:
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
Определите, вошел ли пользователь в систему или нет:
Если пользователь не вошел в систему (возвращается код выхода 1):who | grep $userid
- Затем отобразите
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
Иecho is NOT currently logged on
затем завершите скрипт с кодом 1.
Если пользователь вошел в систему (возвращается код выхода 0):who | grep $userid
- Затем отобразите
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
Иecho is currently logged on
затем завершите скрипт с кодом 0.
Определение того, является ли пользователь действительным:
Если пользователь недействителен (возвращается код выхода 1):grep $userid /etc/passwd
- Затем должно отобразиться
echo "The user you entered, $userid is not a valid user on this system."
Если пользователь действителен (возвращается код выхода 0):grep $userid /etc/passwd
Как мне написать этот сценарий? Какова полная структура? Я застрял на структуре/настройке.
решение1
Поскольку это выглядит как задание, я дам вам только инструменты и несколько подсказок:
Если аргумент не был указан в скрипте, то
$1
(первый аргумент скрипта) будет пустым. Вы можете проверить это с помощью[[ -z $1 ]]
. Если вы хотите отобразить ошибку дляОчень многоаргументы, проверьте количество аргументов с[[ $# -eq 1 ]]
(будет верно для одного аргумента).Команда
gentent passwd "$username"
может быть использована для полученияpasswd
записи для пользователя$username
. Команда завершится ошибкой с ненулевым статусом выхода, если пользователь не существует. Это означает, что вы можете использоватьif ! getent passwd "$username" >/dev/null; then ...; fi
для реагирования на несуществующего пользователя$username
.5-е поле записи
passwd
для пользователяобычносодержит полное имя пользователя (на самом деле нет гарантии, что оно будет в форме "имя фамилия"). Запись может иметь лишние запятые в конце, которые вам придется удалить. Вы можете проанализировать вывод using,getent passwd "$username"
чтобыcut -d: -f 5
добраться до пятого поля, а затем удалить с первой запятой с помощьюname=${name%%,*}
.В некоторых системах полное имя пользователя может содержать
&
символ. В этих системах этот&
символ следует заменить на имя пользователя (чтобы имяSystem &
пользователяoperator
сталоSystem operator
). Я не уверен, что Linux вообще так делает, но это можно сделать с помощьюname=${name/&/$username}
.Утилита
who
выводит список пользователей, которые в данный момент вошли в систему. Для сопоставления$username
с этим используйтеgrep -e "^$username\>"
.\>
Соответствует концу слова, так что egantony
не будет сопоставляться при поиске илиanton
.grep -q
полезно вif
выражении.
Это соответствует следующей структуре кода:
- Проверьте и обработайте недопустимые аргументы (отсутствуют: прочитайте; слишком много: выйдите или просто используйте первый). Один
if
оператор. - Проверка и обработка недействительного имени пользователя. Одно
if
утверждение. - Получить полное имя пользователя. Назначение переменных с подстановкой команд.
- Проверить, вошел ли пользователь в систему (и вывести). Один
if
оператор, возможно сelse
ветвью.
Я не вижу цикла в этом скрипте, поэтому он будет состоять из ряда if
операторов и присваиваний переменных.