Как иметь параметр case в сценариях оболочки, за которым следует другой параметр?

Такое поведение налагается для пользователей, не являющихся -root, в самих утилитах, например вsmbpasswdи вpasswd.

Единственный способ пропустить это — изменить исходный код, устранить последствия (задействованные протоколы могут потребовать старый пароль, я не проверял )и перестроить.

Я полагаю, вы знаете причину этого требования :оно помогает предотвратить изменение вашего пароля другими людьми, если вы оставите свою систему разблокированной или если они получат доступ к вашей учетной записи каким-либо другим способом.

3
15.12.2019, 11:03
1 ответ

Почти наверняка есть лучший способ справиться с тем, что вы делаете. Для начала вам следует избегать запроса пользователя на какие-либо входные данные и вместо этого заставить его предоставлять аргументы в командной строке во время запуска программы, но модифицируя свой код для работы:

read -rp 'choose: ' choice 
case $choice in 
    -a) echo 'you chose a';;
    -s\ [1-4]) "echo you chose the number ${choice#"-s "}";;
esac

Похоже, что ваша переменная numне установлена, поэтому она будет расширяться до нуля, делая ваш шаблон case просто -s )и -s 4не совпадающими с -s ), потому что... ну, это не одно и то же. Поэтому нам нужно изменить это, чтобы ожидать число после него(-s\ [1-4])). Затем мы используем расширение параметра, чтобы удалить -s.


Я бы справился с этим, используя getoptsаналогично:

#!/bin/bash

while getopts as: opt; do
    case $opt in
        a) printf '%s\n' 'You have chosen: a';;
        s) n=$OPTARG; printf '%s: %d\n' 'You have chosen s with an argument of' "$n";;
    esac
done

При этом вы должны указать аргументы в командной строке, такие как:

./script.sh -s 4
1
27.01.2020, 21:29

Теги

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