在bash中编写等效的Python输入函数

时间:2019-04-10 20:22:32

标签: bash

我正在尝试在Bash中编写Python的input函数的简单等效项。

Python脚本中的示例如下:

s = input('Please input something: ')

我想象对Bash等效项的调用看起来像这样:

s=$(input "Please input something: ")

这是我写的实现:

function input {
    # $1 is the prompt passed as an argument; in my above example,
    # it would be 'Please input something: '
    printf "%s" "$1"
    read in
    echo "${in}"
    return 0
}

使用呼叫s=$(input "Please enter something: "),提示从不打印;相反,Bash脚本只是等待用户输入而不会显示文本。按Enter键,即不输入任何内容,将s设置为提示本身。似乎正在发生的事情是s捕获了行printf "%s" "$1"的输出,然后读取了输入并回显了该输入。我也尝试过使用stdout将提示直接指向printf "%s" "$1" >&1,但无济于事。

我如何首先打印提示,然后捕获输入并将其回显给调用函数?

1 个答案:

答案 0 :(得分:4)

您很幸运。它已经以read -p的形式存在。

read -p 'Please input something: ' s

为了安全起见,最好同时使用IFS=-rIFS=确保保留前导和尾随空格。 -r保留反斜杠,因此\n不会被解释为换行符,或者\\变成了\

IFS= read -rp 'Please input something: ' s

关于您的功能为什么不起作用的原因,是因为提示被打印到stdout上,并被捕获。打印到stderr使其显示。

input() {
    printf "%s" "$1" >&2
    read in
    printf '%s\n' "$in"
}

谨慎的脚本编写者将使用printf '%s\n'代替echo。如果用户键入-n-e,则需要打印这些内容,而不是将其解释为选项。