有\t
水平选项卡的选项echo
wolf@linux:~$ echo hello
hello
wolf@linux:~$
wolf@linux:~$ echo -e '\thello'
hello
wolf@linux:~$
中是否有类似的选项read
?
wolf@linux:~$ read -p 'hello '
hello wolf
wolf@linux:~$
wolf@linux:~$ read -p '\thello '
\thello wolf
wolf@linux:~$
所需输出
wolf@linux:~$ read -p '\thello ' <- need something to produce something like tab or `\t` in `echo`
hello wolf
wolf@linux:~$
答案1
您始终可以使用 ksh93 样式$'...'
的引号形式来理解这些转义序列:
IFS= read -r -p $'\thello ' var
( 和IFS=
不-r
相关,我只是在这里添加它们,因为read
没有它们的调用很少有意义)。
请注意,这-p
不是标准sh
函数。在 ksh/zsh 中,-p
是从协进程读取,提示用 指定read 'var?Prompt: '
。不幸的是bash
选择在这里引入一个不兼容的API。不过你不必使用-p
,你可以便携地做:
printf >&2 '\thello '
IFS= read -r var
printf
确实识别其格式参数和说明符参数中的那些转义序列%b
。是否echo
识别它们(或接受-e
识别它们的选项)取决于实现,并且对于许多实现(包括bash
内置)取决于构建时间和运行时设置,因此最好避免。
答案2
您总是可以简单地添加 8 个空格:
read -p ' hello '
但是,是的,您还可以获得实际的制表符:
read -p $'\t''hello '
或者
read -p "$(echo -e '\thello ')"
或者
read -p "$(printf '\thello ')"