如何在BASH和ZSH中向用户展示可编辑的输入?

3
我需要在既可以运行BASH又可以运行ZSH的shell脚本中接受用户输入。我习惯于在其他语言中使用readline,但在shell脚本中似乎不是一个可行的选项。
一个示例提示可能是:
Please enter the value> 1234_

我该如何为用户提供可编辑的输入框,并具有默认值,可以在两个不同的 shell 上进行编辑(包括退格)?

1
对于zsh,您可能想查看ZLE模块的vared内置。假设i=1234; vared -p 'Please enter the value> ' i - Toby Speight
没有任何东西可以在两个shell中同时工作,因为每个shell使用不同的行编辑器(bash使用Readline,zsh使用ZLE)。 - chepner
@Cyrus 谢谢!你让我的一天更美好 :-)您可能还想包含一个变量(例如称为"answer")用于存储用户输入: read -e -p '请输入值> ' -i '1234' answer 将会得到类似如下的结果: 请输入值> 1236. 显示编辑后的用户输入:echo "$answer" 1236 - Bernie Reiter
2
@BernieReiter:这当然是可能的,但并非绝对必要。如果未指定变量,则read使用变量REPLY。如果您指定一个变量,代码当然更易于理解。 - Cyrus
@Cyrus 再次感谢!每天学习新的有价值的东西 :-) - Bernie Reiter
1
@cyrus,我已经将您的评论转化为下面的答案。在我看来,这本来就应该是一个答案。 - Catskul
2个回答

1

在评论中,用户@cyrus提到了,但最好直接作为答案回复:

read -e -p 'Please enter the value> ' -i '1234' myvar
echo $myvar

结果是默认的可编辑值为 1234

Please enter the value> 1234
1234

1
输出结果将存储在变量 REPLY 中。 - Cyrus
3
在zsh中似乎无法工作:read: -p: no coprocess。意思是在zsh中使用read命令时出现了错误提示,指出没有协处理器(no coprocess)可用。 - raarts

-2
如果我没有误解... 就“退格”功能而言,可以删除最后的字符并添加一些新字符... 使用脚本中的简单“read”在两个Shell中都可以实现。
echo -n "Enter value > "
read v
echo $v

如果您有其他问题,请重新表述以使您的问题更清晰? 您使用什么(示例代码)。 在编辑方面,您确切地执行什么操作(仅限BS还是指行编辑命令CTRL-A等)。 结果/错误是什么,您想要修复什么。 谢谢。


1
我完全不了解zsh,但从Bash的角度来看:echo -n是非便携的;在行的开头以外使用read会混淆readline对列位置的理解。这就是为什么read有一个-p选项的原因。 - Toby Speight
2
这并没有提供“初始值”,这是问题的主要点。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接