Отступ «чтения» ввода, когда он содержит несколько строк - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть команда read в скрипте bash, чьи входные данные определяют массив. Входными данными часто являются скопированные / вставленные данные, содержащие несколько строк. Каждая строка в многострочном вводе корректно захватывается и добавляется в массив как отдельные элементы, но я бы хотел сделать отступ для каждой строки с префиксом > в окне терминала, когда она вставляется в.

Это для bash v3, работающего на macOS. Я пробовал различные варианты команды read, но не смог найти ничего, что сработало.

Скрипт:

#!/bin/bash
echo "Provide inputs:"
until [[ "$message" = "three" ]]; do
    read -p "> " message
    myArray+=($message) #Input added to array for later processing
done

Вводимые вручную данные выглядят так:

Provide inputs:
> one
> two
> three

Но многострочный ввод с копированием / вставкой выглядит следующим образом:

Provide inputs:
> one
two
three
> > 

Желаемый результат заключается в том, чтобы многострочный ввод с копированием / вставкой выглядел идентично введенным вручную входам.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

(Ответ изменился после объяснения ОП, что он хочет). Экран будет выглядеть одинаково, когда ввод вводится построчно, и при вводе после копирования-вставки нескольких строк при удалении > (я добавил -r с учетом специальных символов).

until [[ "$message" = "three" ]]; do
   read -r message
   myArray+=("$message")
done

Когда вы хотите увидеть >, вы можете использовать некрасиво

printf "> "
until [[ "$message" = "three" ]]; do
   read -rs message
   printf "%s\n> " "${message}"
   myArray+=("$message")
done

В этом случае ввод отображается толькопосле Enter, так что это выглядит хуже.

0 голосов
/ 09 ноября 2019

Похоже, проблема в том, как работает чтение. Прочитайте нажатие клавиш echos back, и я думаю, что возможно из-за буфера stdout происходит запись до того, как операторы echo сбрасываются.

Использование комбо команды echo и аргумента -e для чтения (интерактивного) исправляет это в моем тестировании.

#!/bin/bash
echo "Provide inputs:"
until [[ "$message" = "three" ]]; do
    echo -ne "> "
    read -e message
    myArray+=($message) #Input added to array for later processing
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...