Сценарий Bash, показывающий изменение значений команд в реальном времени.

Проблема заключается в заключении строк в текстовые поля в кавычки.

Используйте здесь -документ (, который позволит вам написать более красивое выражение):

sqlite3 database <<END_SQL
    UPDATE stats
    SET downspeed=$DN,
        upspeed=$UP,
        downlocalip="$downlocalip",
        downremoteip="$downremoteip",
        uplocalip="$uplocalip",
        upremoteip="$upremoteip"
    WHERE primkey=1
END_SQL

Предполагается, что у вас есть полный контроль над значениями в переменных, поэтому вы знаете, что они должным образом очищены и не создают уязвимости SQL-инъекций.


Из комментариев:

Выполнение этого через SSH:

ssh user@server sqlite3 database <<END_SQL
    UPDATE stats
    SET downspeed=$DN,
        upspeed=$UP,
        downlocalip="$downlocalip",
        downremoteip="$downremoteip",
        uplocalip="$uplocalip",
        upremoteip="$upremoteip"
    WHERE primkey=1
END_SQL
8
14.11.2019, 14:20
2 ответа

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

Вам необходимо :выполнить все команды (, не касаясь дисплея )и сохранить результаты в 4 переменных, затем очистить и отобразить эти 4 результата одновременно.

Если я изменю ваш сценарий, попробуйте:

#!/bin/bash
while sleep 1; do
    # facultative?#  tput cup 0 0
    ccab="$(npe ?AI1)"
    cane="$(npe ?AI2)"
    ctemp="$(npe ?AI3)"
    ctemp2="$(npe ?AI4)"
    clear
    printf "%21s %6d    \n" \
      "Célula calibrada: "   "$ccab" \
      "Anemómetro: "         "$cane" \
      "Célula temperatura: " "$temp" \
      "Célula temperatura: " "$temp2"
done

Здесь происходит длительное выполнение 4 запросов без изменения отображения, затем отображение очень быстро обновляется и отображается все сразу с 4 новыми значениями.

2
27.01.2020, 20:08

Это делает 50 строк без мерцания, поскольку использует tput для обновления каждой строки отдельно. Чтобы доказать это, я добавил 0,01 между каждой строкой.

Запуск скрипта с аргументом y показывает примеры того, что использует окно терминала для позиционирования курсора. Я жестко -закодировал свои побеги в эхе. Ваш может быть другим. Для переносимости вы должны использовать tput для динамического создания последовательностей. Для повышения производительности вы должны заранее получить все последовательности tput, которые вам когда-либо понадобятся для вашего приложения, и сохранить их в оболочке. Кроме того, как только у вас появится фиксированный текст, просто измените переменные части.

Обратите внимание, что позиции экрана начинаются с (0, 0 )в tput args. Кроме того, ведущие нули в экранных командах интерпретируются как восьмеричные, поэтому я переформатирую видимый номер строки с помощью printf. Также вежливо переместить курсор в сторону (, например, на (0,0 ))после обновления.

#! /bin/bash

#.. See what a CUrsor Position is on the current terminal.
[[ "${1}" == y ]] && {
    for r in {0..19}; do
        tput cup ${r} 15 | od -An -t ax1
    done
    exit
}

tput clear

while sleep 1; do
    for k in {1..50}; do
        sleep 0.01
        RW=$( printf '%.2d' ${k} )
        TS=$(date "+%Y-%m-%d %H:%M:%S.%N")
        echo -n -e "\e[${k};1H${RW}  ${TS}"
    done
    echo -n -e "\e[52;1H"
done
2
27.01.2020, 20:08

Теги

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