Проблемы с разрешением только одного аргумента

Правильный синтаксис для locale.gen::

de_DE.UTF-8 UTF-8 
en_US.UTF-8 UTF-8

Проблема решена!

0
13.04.2020, 10:13
2 ответа

Решил с помощью:

if [ $# -ne 1 ]; then
    echo -n "Please enter a single, valid user id: "
    read userid
else
    userid="$1"
fi
0
19.03.2021, 02:30

Да, ваш тест [ -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\>".

Я упомянул об этом в своем ответе на ваш предыдущий вопрос .

0
19.03.2021, 02:30

Теги

Похожие вопросы