包含多行时缩进“读取”输入

时间:2019-11-09 03:20:06

标签: bash

我在bash脚本中有一个read命令,其输入定义了一个数组。输入通常是包含多行的复制/粘贴数据。多行输入中的每一行均已正确捕获,并作为单独的元素添加到数组中,但是我希望在粘贴时在终端窗口中以>前缀缩进每行。

这适用于在macOS上运行的bash v3。我已经尝试过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 :(得分:0)

听起来问题在于阅读的方式。读回显回击击键,我认为也许是因为有stdout缓冲区,在刷新回显语句之前它是写的。

使用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

答案 1 :(得分:0)

(在解释了OP的要求后,答案发生了变化) 当逐行输入以及删除>时复制粘贴多行之后输入时,屏幕看起来是相同的(鉴于特殊字符,我添加了-r)。 / p>

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之后,因此看起来更糟。