Такое поведение налагается для пользователей, не являющихся -root, в самих утилитах, например вsmbpasswd
и вpasswd
.
Единственный способ пропустить это — изменить исходный код, устранить последствия (задействованные протоколы могут потребовать старый пароль, я не проверял )и перестроить.
Я полагаю, вы знаете причину этого требования :оно помогает предотвратить изменение вашего пароля другими людьми, если вы оставите свою систему разблокированной или если они получат доступ к вашей учетной записи каким-либо другим способом.
Почти наверняка есть лучший способ справиться с тем, что вы делаете. Для начала вам следует избегать запроса пользователя на какие-либо входные данные и вместо этого заставить его предоставлять аргументы в командной строке во время запуска программы, но модифицируя свой код для работы:
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