Я новичок в написании скриптов Bash, и мой скрипт работает неправильно. Я не знаю, как это исправить или как правильно его закодировать. Пользователь должен иметь возможность ввести только один аргумент. ( $ nowOn f132a99
) Если вы введете более одного аргумента, то появится сообщение Please enter a single, valid user id: "
Я не уверен, как это исправить.
$ nowOn f132a99 = Правильный вывод
$ nowOn f132a99 f132a98 = Ошибка в строке 1. Ожидается бинарный оператор
$ nowOn f132a99 f132a98 f132a97 = Ошибка в строке 1 Слишком много аргументов
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
Я также попробовал следующий код ниже, но если вы введете более одного аргумента ( nowOn f132a99 f132a97
), то он просто отобразит результаты для f132a99 и проигнорирует остальные, а не выведет на экранPlease enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
решение1
Да, ваш тест [ -z "$@" ]
не работает так, как вы ожидаете. "$@"
Будет расширен до каждого отдельного аргумента командной строки, заключенного в кавычки, что дает вам тест, который по сути выглядит как [ -z "f132a99" "f132a98" "f132a97" ]
для трех аргументов.
Что вам следует сделать, если вы хотите, чтобы пользователь всегда приводил только один аргумент, это именно то, о чем вы упомянули.в вашем собственном ответе, т.е. используйте тест, подобный [ "$#" -ne 1 ]
тесту для проверки недопустимого ввода.
Однако есть и другой вариант, а именно рассмотретьвсезаданных аргументов как идентификаторов пользователей и выполнить цикл по ним:
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
Другие примечания о вашем коде:
Тест на допустимые идентификаторы пользователей некорректен. Рассмотрим систему, в которой нет пользователя с именем bill
, но естьявляетсяa billy
. Ввод bill
в качестве идентификатора пользователя не обнаружит его как недействительный идентификатор пользователя grep -q "$userid" /etc/passwd
(эта команда также может вызвать ошибку, если $userid
строка начинается с дефиса).
Лучше было бы провести тестирование с помощью getent -- passwd "$userid"
и выполнить все операции, связанные с извлечением данных из passwd
базы данных, через getent passwd
.
У вас похожая проблема с who | grep "$userid"
, который лучше записать как who | grep -q "^$userid\>"
.
Я упомянул эти вещив моем ответе на ваш предыдущий вопрос.
решение2
Решил это с помощью:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi