我正在尝试在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
,但无济于事。
我如何首先打印提示,然后捕获输入并将其回显给调用函数?
答案 0 :(得分:4)
您很幸运。它已经以read -p
的形式存在。
read -p 'Please input something: ' s
为了安全起见,最好同时使用IFS=
和-r
。 IFS=
确保保留前导和尾随空格。 -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
,则需要打印这些内容,而不是将其解释为选项。