Правильный синтаксис для locale.gen::
de_DE.UTF-8 UTF-8
en_US.UTF-8 UTF-8
Проблема решена!
Решил с помощью:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
Да, ваш тест [ -z "$@" ]
работает не так, как вы ожидаете. "$@"
будет расширяться до каждого отдельного аргумента командной строки, заключенного в кавычки, что дает вам тест, который по существу выглядит как [ -z "f132a99" "f132a98" "f132a97" ]
для трех аргументов.
Что вам следует сделать, если вы хотите, чтобы пользователь когда-либо приводил только один аргумент, это именно то, что вы упоминаете в своем собственном ответе , то есть используйте тест, подобный [ "$#" -ne 1 ]
, для проверки на недопустимый ввод..
Тем не менее, есть еще один вариант, а именно рассматривать все заданные аргументы как идентификаторы пользователей и перебирать их в цикле:
if [ -z "$1" ]; 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\>"
.
Я упомянул об этом в своем ответе на ваш предыдущий вопрос .