Mau*_*Mau 6 bash prompt variable
我该怎么做才能将光标留在 Bash 脚本中建议的同一行?
Bash 版本 = 3.2.51
它的目的是建议一个字符串,以便用户只需按 Enter。
#!/bin/sh
echo "@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@"
echo "our-platform-7.26-2.17-res4"
read SuggestDefaultPlatform
echo "Stored name: " ${SuggestDefaultPlatform}
Run Code Online (Sandbox Code Playgroud)
这提示:
@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@
our-platform-7.26-2.17-res4
_
Run Code Online (Sandbox Code Playgroud)
其中下划线“ _”代表光标。
我不想使用“Y/n”逻辑解决方法,将默认值分配给“ SuggestDefaultPlatform”变量
SuggestDefaultPlatform='our-platform-7.26-2.17-res4';
Run Code Online (Sandbox Code Playgroud)
然后提示一个问题,如:
Are you okay with `'our-platform-7.26-2.17-res4'` as your platform name? [Y/n]...
Run Code Online (Sandbox Code Playgroud)
相反,用户可能只想更改提示建议的几位数字,然后按 Enter。请参阅下面_“ SuggestDefaultPlatform”变量末尾的光标“ ” :
@@@@@@@@@@
@ Enter the new plarform name [for example: our-platform-7.26-2.17-res4]:
@@@@@@@@@@
our-platform-7.26-2.17-res4_
Run Code Online (Sandbox Code Playgroud)
以便用户可以移动光标、修改建议和/或按 Enter。
our-platform-7.26-2.17-res_
our-platform-7.26-2.17-re_
our-platform-7.26-2.17-r_
our-platform-7.26-2.17-_
our-platform-7.26-2.17_
our-platform-7.26-2.1_
our-platform-7.26-2.18-alpha1_
Run Code Online (Sandbox Code Playgroud)
按 Enter。
这提示:
Stored name: our-platform-7.26-2.18-alpha1
Run Code Online (Sandbox Code Playgroud)
sh(如sh语言规范中所示)没有附带行编辑器。终端驱动程序有一个基本的行编辑器,允许使用退格键和其他一些键来编辑输入的行,但通常不允许箭头键。
您可以使用 ioctl 将默认值插入终端驱动程序输入缓冲区,TIOCSTI例如:
printf 'Please enter the value: '
value=the-default
perl -MPOSIX -e 'require "sys/ioctl.ph"; tcflush 0,2;
ioctl(STDIN, &TIOCSTI, $_) or die "$!\n"
for split "", join " ", @ARGV' "$value"
IFS= read -r value
Run Code Online (Sandbox Code Playgroud)
在 上, ( )read的内容将像键入一样被插入。$valuethe-default
现在,如果您想要一个更高级的行编辑器,例如可以使用箭头键提供的libreadline,您可以使用类似的东西rlwrap(尽管不是标准命令):
value=the-default
value=$(rlwrap -S 'Please enter the value: ' -P "$value" -o cat)
Run Code Online (Sandbox Code Playgroud)
rlwrap通常用于readline向没有行编辑器的应用程序添加类似行编辑器。上面我们向 中添加了一个行编辑器cat,并以一次性模式 ( -o) 使用它,以便cat在输入一行后返回(尽管您仍然可以使用 来输入多行Ctrl+V,Ctrl-J就像在bash.
如果您准备好使用非标准 shell,zsh或者bash使用其自己的行编辑器内置了该 shell。
在zsh:
value=the-default
vared -p 'Please enter the value: ' value
Run Code Online (Sandbox Code Playgroud)
在bash:
value=the-default
IFS= read -re -i "$value" -p 'Please enter the value: ' value
Run Code Online (Sandbox Code Playgroud)
简短的回答:使用-n标志进行回显。
稍微好一点的答案:默认echo行为是将每个参数打印到标准输出,后跟换行符。这些字符的特殊之处在于您看不到它们,因为它们是表示输出格式的基本方式。存在制表符、换行符、回车符等所有类型。
如果我们没有一种简单的方法来告诉 shell 当我们想要插入制表符或换行符之类的东西时,那将是非常乏味的。为了克服这个问题,echo 定义了某些转义字符以使其具有特殊含义。 \n表示换行,\t表示输出制表符[link]。
在下面的示例中,您可以看到这一点的实际效果。我使用tr它将字符从一组转换为另一组。输出将-在所有发现换行符的地方显示:
echo "Hello\nFriends" | tr "\n" "-"
Hello\nFriends-
Run Code Online (Sandbox Code Playgroud)
请注意,我们在末尾发现了一个换行符,因为它是由 . 自动添加的echo。现在,我们可以用来-e禁用该行为。请注意末尾没有破折号:
echo -en "Hello\nFriends" | tr "\n" "-"
Hello\nFriends
Run Code Online (Sandbox Code Playgroud)
如果您想让echo输出具有转义序列的含义(如上所示\n),请使用-e:
echo -e "Hello\nFriends"
Hello
Friends
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5857 次 |
| 最近记录: |