Хочу написать скрипт который при запуске будет просить пользователя ввести значение для переменной и только после ввода будет продолжать работу, при этом запретить использование пробела и спец символов (всех окромя дефиса и подчеркивания, в том числе точки, запятой и т.д.), а в случае если пользователь все же ввел запрещенный символ заменять его на дефис или подчеркивание и при этом вывести сообщение что был использован запрещенный символ и содержимое переменной было приведено к виду и вывести то что получилось после замены, если пользователь согласен с таким значением - жмет Y, если нет - жмет N и возвращается к вводу значения заново.
просить пользователя ввести значение для переменной
text
help read
text
man bash
"sotariz" написал:
при этом запретить использование пробела и спец символов (всех окромя дефиса и подчеркивания, в том числе точки, запятой и т.д.), а в случае если пользователь все же ввел запрещенный символ заменять его на дефис или подчеркивание и при этом вывести сообщение что был использован запрещенный символ и содержимое переменной было приведено к виду и вывести то что получилось после замены, если пользователь согласен с таким значением - жмет Y, если нет - жмет N и возвращается к вводу значения заново.
тоже read, только по одному символу (опция -c), и без эха. Эхо делайте сами
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
можно, главное помнить, что ${parameter//a/b} -- bash-изм и не применять там, где может быть не bash (например, установочные сценарий пакета Slackware (install/doinst.sh сотоварищи) ;-) )
"drBatty" написал:
научить работать с символами в bash. По одному.
А вот именно такое, работа с символами в bash, чаще всего требует чего-то более простого/универсального (не всегда, допускаю случаи, когда без этого ну никак не обойтись).
А вот именно такое, работа с символами в bash, чаще всего требует чего-то более простого/универсального (не всегда, допускаю случаи, когда без этого ну никак не обойтись).
ИМХО более простое/универсальное -- команда y из perl&sed.
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 действительно не подойдет.
И да, поскольку правильный вопрос должен завсегда содержать более половины ответа, целесообразнее определить, не что удалять, а что оставлять, заменяя всё остальное -- не останется возможности для разночтений.
drBatty, это была не придирка, а вопрос о том, нужно ли вдаваться в особенности utf8 в части невстречаемости кодов верхней половины ASCII в составе 2+ байтовых комбинаций символов в utf8.
А про bash/не-bash в исходном сообщении не было. Да и не в том дело, как правило аналогичные задачи уже имеют решение, не требующие посимвольного перебора строк (о чём выше уже говорил), а использование расширенных возможностей bash -- поминания о них. Впрочем, шебанг вполне можно считать таковым поминанием.