Я полагаю, что вы ищете пакет ncurses .
Википедия описывает ncurses следующим образом:
ncurses (новые проклятия) - это программная библиотека, предоставляющая API, который позволяет программисту писать текстовые пользовательские интерфейсы в терминально-независимый способ. Это набор инструментов для разработки прикладного программного обеспечения, похожего на графический интерфейс , которое работает под управлением эмулятора терминала
. Он широко используется, например, в инструменте настройки ядра menuconfig:
Поскольку вы используете bash, вы можете использовать Bash Simple Curses (как упомянуто Runium в комментарии ниже).
Я нашел эти примеры на SO в этих вопросах и ответах под названием: Как выполнить цикл for для каждого символа в строке в BASH? .
Вот сценарий под названием onechar1.bash
.
#!/bin/bash
echo "Please enter a word:
(leave blank and press Enter to exit)"
read someStr
if [[ $someStr == '' ]]; then
exit
fi
while test -n "$someStr"; do
c=${someStr:0:1} # Get the first character
echo "character is $c"
someStr=${someStr:1} # trim the first character
done
Когда я запускаю его:
$ ./onechar1.bash
Please enter a word:
(leave blank and press Enter to exit)
My Name is Mauro
character is M
character is y
character is
character is N
character is a
character is m
character is e
character is
character is i
character is s
character is
character is M
character is a
character is u
character is r
character is o
$
Вот еще один сценарий, onechar2.bash
:
#!/bin/bash
echo "Please enter a word:
(leave blank and press Enter to exit)"
read someStr
if [[ $someStr == '' ]]; then
exit
fi
for (( i=0; i<${#someStr}; i++ )); do
echo ${someStr:$i:1}
done
Когда я запускаю этот сценарий:
$ ./onechar2.bash
Please enter a word:
(leave blank and press Enter to exit)
My Name is Mauro
M
y
N
a
m
e
i
s
M
a
u
r
o
$
Вот по крайней мере один переносимый метод Posix, который полагается только на встроенные модули оболочки (за возможным исключением printf), (Posix) нарезку параметров и пытается зацикливаться как можно меньше:
lowerunder() { local c="${1%[A-Z ]*}"
set -- "$1" "$c" "${1#"$c"}"
[ -z "$3" ] && printf %s "$1" || {
c="${3%"${3#?}"}"
[ -z "${c#[ ]}" ] && c=_
[ -z "${c#[A-Z]}" ] && {
c="$(printf %x "'$c")";
c="$(printf %b "\x$((c+20))")" ; }
lowerunder "${2}${c}${3#?}"
} ; }
Подайте ему один аргумент, заключенный в кавычки, и он заменит пробелы внутри и все прописные символы на строчные.
Подайте ему два или более, и он все равно вернет ваш первый аргумент, преобразованный в нижний регистр, а пробелы - в подчеркивания. Это не так уж много.
Признаюсь, я не силен в шестнадцатеричной математике, и это может быть слабым местом здесь - я использую printf для преобразования из кода символов Ascii в шестнадцатеричное значение в десятичное и обратно. Тем не менее, писать было весело.