LinuxForum.Fans
Тема

Запрос ввода из скрипта

Автор: sotariz 31 сообщений 11052 просмотров
#343056

Хочу написать скрипт который при запуске будет просить пользователя ввести значение для переменной и только после ввода будет продолжать работу, при этом запретить использование пробела и спец символов (всех окромя дефиса и подчеркивания, в том числе точки, запятой и т.д.), а в случае если пользователь все же ввел запрещенный символ заменять его на дефис или подчеркивание и при этом вывести сообщение что был использован запрещенный символ и содержимое переменной было приведено к виду и вывести то что получилось после замены, если пользователь согласен с таким значением - жмет Y, если нет - жмет N и возвращается к вводу значения заново.

#343076

на лабораторную похоже

echo "Please, enter value .. "

read VALUE

if [ проверка ввода ]..

#343087
"sotariz" написал:
просить пользователя ввести значение для переменной
text
help read
text
man bash
"sotariz" написал:
при этом запретить использование пробела и спец символов (всех окромя дефиса и подчеркивания, в том числе точки, запятой и т.д.), а в случае если пользователь все же ввел запрещенный символ заменять его на дефис или подчеркивание и при этом вывести сообщение что был использован запрещенный символ и содержимое переменной было приведено к виду и вывести то что получилось после замены, если пользователь согласен с таким значением - жмет Y, если нет - жмет N и возвращается к вводу значения заново.

тоже read, только по одному символу (опция -c), и без эха. Эхо делайте сами

text
help echo
#343089
"moshell" написал:
на лабораторную похоже

похоже)) но это для личного удовлетворения и снижения затрат времени для создания сертификатов openvpn :)

"moshell" написал:
read VALUE

сама VALUE это и есть переменная в которую будет записываться ввод или что это?

"moshell" написал:
if [ проверка ввода ]

вот тут загвоздочка - пока еще не сталкивался с пробегом по тексту в поиске нужного символа

#343092

drBatty, за отправление в ман спасибо... правда они мне тяжко даются, быстрее понимаю с примерами и в обсуждении

#343094

"sotariz" написал:
сама VALUE это и есть переменная в которую будет записываться ввод или что это?
оно и есть
Ладно, раз НЕ лаба, то напишу сейчас что-то похожее. Через 10 минут, если не забанят :)
#343100
text
$ ./sotarizm.bash 
qwer__aa--
qwer??aa??
$ cat sotarizm.bash 
#!/bin/bash

read VALUE

LEN_VALUE=${#VALUE}

for (( J = 0; J < LEN_VALUE; J++)); do C="${VALUE:$J:1}" if [ "$C" == "-" ] || [ "$C" == "_" ]; then C="?" fi echo -n "$C" done echo

#343104

банить доктора - не спортивно.
банить доктора - кощунство!

да, вспыльчив.
да, клоуничает.
да, самоуверен.

всем великим людям сложно жить в этом мире ;D

#343107

drBatty,

"sotariz" написал:
запрещенный символ заменять на дефис
text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

import re

st = raw_input("Enter string: ") print(re.sub(r'[,./?`~!@#$%^&*()+=|\"\'\\]', '-', st))

text

$ ./input.py 
Enter string: xcv?xcvx.rtert'ert\e567
xcv-xcvx-rtert-ert-e567

#343109

sotariz, Вы бы для начала изучили код перед запуском,
а то мало ли..

давно известный мем в рунете о том, как "кракозябры" сотворяют rm -rf /
:D

#343113

"drBatty" написал:
text
for (( J = 0; J < LEN_VALUE; J++)); do
    C="${VALUE:$J:1}"
    if [ "$C" == "-" ] || [ "$C" == "_" ]; then
        C="?"
    fi
    echo -n "$C"
done

Проще. Сначала man tr, потом что-то вроде:
text

QVALUE=$(echo $VALUE | tr "[:cntrl:][:space:],./?`~!@#$%^&*()+=|\"\'\\" "_")
if [ x"$QVALUE" != x"$VALUE" ]; then # была замена, надо спросить пользователя...
...
fi
#343114

bormant, цель моего примера: научить работать с символами в bash. По одному.

И да, ваш код тоже можно упростить до

text
${VALUE//[-_]/?}
#343115
"-=Serj=-" написал:
#!/usr/bin/env python

зачем питон, если есть bash? Почему например не perl?

#343116
"drBatty" написал:
зачем питон, если есть bash? Почему например не perl?

Пишу на том, что более-менее знаю. И.. зачем bash, если есть python? :)

#343118

"drBatty" написал:
тоже можно упростить до
можно, главное помнить, что ${parameter//a/b} -- bash-изм и не применять там, где может быть не bash (например, установочные сценарий пакета Slackware (install/doinst.sh сотоварищи) ;-) )

"drBatty" написал:
научить работать с символами в bash. По одному.
А вот именно такое, работа с символами в bash, чаще всего требует чего-то более простого/универсального (не всегда, допускаю случаи, когда без этого ну никак не обойтись).
#343123

"bormant" написал:
bash-изм
началось. А $() не башизм, не?

"bormant" написал:
А вот именно такое, работа с символами в bash, чаще всего требует чего-то более простого/универсального (не всегда, допускаю случаи, когда без этого ну никак не обойтись).
ИМХО более простое/универсальное -- команда y из perl&sed.
#343125

bormant, да, кстати. Про совместимость. Эта ваша tr (как и perl по дефолту) не умеет работать с utf-8.

text
$ echo "☢-☢-☢-☢" | tr '-☢' '+☣'
tr: неверный ключ — «�»
По команде «tr --help» можно получить дополнительную информацию.
$ echo "☢-☢-☢-☢" | sed 'y/-☢/+☣/'
☣+☣+☣+☣

т.е. про русский язык можно смело забыть...

#343128
"drBatty" написал:
А $() не башизм, не?
Нет. http://www.opennet.ru/man.shtml?topic=sh&russian=2&category=&submit=%F0%CF%CB%C1%DA%C1%D4%D8+man#lbBI

Command Substitution
Command substitution allows the output of a command to be substituted in place of the command name itself. Command substitution occurs when the command is enclosed as follows:

$(command)

or (“backquoted” version):

`command`

"drBatty" написал:
Про совместимость. Эта ваша tr (как и perl по дефолту) не умеет работать с utf-8.
Угу. Не здорово. Вот только с точки зрения примера этого топика (замена на "-" или "_" символов "пробела и спец символов (всех окромя дефиса и подчеркивания, в том числе точки, запятой и т.д.)") это не имеет никакого значения (так устроена utf8). Верите?
Ах да, если к спецсимволам относится что-то не из ASCII, то tr действительно не подойдет.
И да, поскольку правильный вопрос должен завсегда содержать более половины ответа, целесообразнее определить, не что удалять, а что оставлять, заменяя всё остальное -- не останется возможности для разночтений.
#343159

"bormant" написал:
Верите?
а у ТСа bash. Верите? Да, я тоже умею придираться к словам ;)
#343194

drBatty, это была не придирка, а вопрос о том, нужно ли вдаваться в особенности utf8 в части невстречаемости кодов верхней половины ASCII в составе 2+ байтовых комбинаций символов в utf8.
А про bash/не-bash в исходном сообщении не было. Да и не в том дело, как правило аналогичные задачи уже имеют решение, не требующие посимвольного перебора строк (о чём выше уже говорил), а использование расширенных возможностей bash -- поминания о них. Впрочем, шебанг вполне можно считать таковым поминанием.

Войдите или зарегистрируйтесь, чтобы ответить.