Как циклично выполниться, чтение функционируют в Сценарии Bash?

Я полагаю, что вы ищете пакет ncurses .

Википедия описывает ncurses следующим образом:

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

. Он широко используется, например, в инструменте настройки ядра menuconfig: Screen shot of Linux kernel menuconfig tool

Поскольку вы используете bash, вы можете использовать Bash Simple Curses (как упомянуто Runium в комментарии ниже).

1
06.03.2014, 15:34
2 ответа

Я нашел эти примеры на SO в этих вопросах и ответах под названием: Как выполнить цикл for для каждого символа в строке в BASH? .

Пример №1 - деструктивный

Вот сценарий под названием 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
$

Пример № 2 - неразрушающий

Вот еще один сценарий, 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
$
1
27.01.2020, 23:15

Вот по крайней мере один переносимый метод 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 в шестнадцатеричное значение в десятичное и обратно. Тем не менее, писать было весело.

1
27.01.2020, 23:15

Теги

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