echo "my name is=`read` and am from `read`"
预期输出:
my name is=sudhir and am from india
值sudhir
和india
是使用输入。
如何做到这一点,我喜欢在480个问题中应用这个。不知道每个问题所需的用户输入数量。请帮忙。
答案1
read
默认情况下从输入中读取单词转化为变量。
`cmd`
,古老的形式$(...)
捕捉了输出的一个命令。默认情况下,read
不产生任何输出。当您键入要阅读的内容时您看到的文本read
是回声终端设备的,它不是由read
1 输出的。
一些read
实现可以输出它们所读取的内容。例如,zsh
的read
内置函数可以使用-e
or来实现这一点-E
(后者除了回显输入之外还将输入存储在变量中)。
所以在zsh
:
echo "my name is=$(read -e) and am from $(read -e)"
便携地,你可以读取一行输入(而不是特殊的阅读行为read
) 并将其输出回来head -n1
。但请注意,如果标准输入不是终端设备或可查找文件,则大多数head
实现将读取不止一行。
许多系统仍然有一个line
命令(曾经是标准的,后来被弃用)。
echo "my name is=$(line) and am from $(line)"
它应该一次读取一个字节,因此不要读取超过一行的输入。
如果不可用,您始终可以line
使用以下命令进行模拟read
:
line() {
IFS= read -r line
ret=$?
printf '%s\n' "$line" || return "$ret"
}
或者甚至把它变成一个
prompt() {
printf >&2 %s "$1"
IFS= read -r answer
printf '%s\n' "$answer"
}
printf '%s\n' "my name is=$(
prompt "What is your name? ") and am from $(
prompt "Where are you from? ")"
(这里使用printf
而不是echo
asecho
一般不能用于任意数据)。
(与 相同zsh
)IFS= read -re '?What is your name? '
。
为了完整起见,使用csh
或tcsh
,您可以执行以下操作:
printf '%s\n' "my name is=$< and am from $<"
$<
是 csh 将输入读取到变量的方式。
如果您想对每两行输入重复一次,最好使用文本处理实用程序,例如awk
:
awk '{name=$0; getline place; print "my name is="name" and am from "place}'
¹ 除非read
配置为自行实现行编辑器,例如使用read -e
inbash
或通过设置emacs
,gmacs
或vi
in 选项ksh93
(并且 stdin 是终端设备),但随后read
会输出回声在标准错误上,而不是标准输出上。