5

Я кодировал индикатор прогресса в виде падающей колоды карт (идея моей жены).

Это еще не в окончательном виде. Вот код:

vdeck="| | | | | "
hdeck[1]="__ | | | |"
hdeck[2]="__ __ | | |"
hdeck[3]="__ __ __ | |"
hdeck[4]="__ __ __ __ |"
hdeck[5]="__ __ __ __ __"

while true
do
    clear
    echo -n -e "\r$vdeck"
    sleep 0.8

    for i in 1 2 3 4 5
    do
        echo -n -e "\r${hdeck[$i]}"
        sleep 0.2
    done
    clear
done

Можно ли оптимизировать этот код без использования массива hdeck и получения того же эффекта? Увеличение «|» означает увеличение комбинаций массивов 'hdeck', что не очень хорошо.

2 ответа2

3

Что-то вроде этого?

#!/bin/bash
LEN=5
echo 'start';
for (( i=0; i<((${LEN}+1)); i++ )); do
echo -ne '\r' 
        for (( j=0; j<${i}; j++ )); do
                 echo -n '_'
        done
        for (( j=${i}; j<${LEN}; j++ )); do
                 echo -n '|'
        done
sleep 0.5
done
echo -e '\ndone'
1

Хорошо, почему у вас нет единственной строки (все '|') и попробуйте заменить (первый) '|' с '-' в каждой итерации цикла?

Пример замены строки:

stringZ=abcABC123ABCabc

echo ${stringZ/abc/xyz}       # xyzABC123ABCabc
                              # Replaces first match of 'abc' with 'xyz'.

Таким образом, вам не нужно несколько строк без массива hdeck.

Попробуй это:

deck="| | | | | "

while true
do
    clear
    echo -n -e "\r$deck"
    sleep 0.8

    for ((i=1; i<=`expr length $deck`; i++))
    do
        echo -n -e "\r${deck/|/-}"
        sleep 0.2
    done
    clear
done

Приведенный выше скрипт должен это сделать .. Это всего лишь примерный сценарий, и я не запускал его сам .. Пожалуйста, проверьте синтаксические ошибки.

Более подробная информация о работе со строками в bash находится здесь - http://tldp.org/LDP/abs/html/string-manipulation.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .