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

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

Я новичок в написании скриптов 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

Связанный контент