在shell脚本中如何使用read in echo

在shell脚本中如何使用read in echo
echo "my name is=`read` and am from `read`"

预期输出:

my name is=sudhir and am from india

sudhirindia是使用输入。

如何做到这一点,我喜欢在480个问题中应用这个。不知道每个问题所需的用户输入数量。请帮忙。

答案1

read默认情况下从输入中读取单词转化为变量

`cmd`,古老的形式$(...)捕捉了输出的一个命令。默认情况下,read不产生任何输出。当您键入要阅读的内容时您看到的文本read回声终端设备的,它不是由read1 输出的。

一些read实现可以输出它们所读取的内容。例如,zshread内置函数可以使用-eor来实现这一点-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而不是echoasecho一般不能用于任意数据)。

(与 相同zshIFS= read -re '?What is your name? '

为了完整起见,使用cshtcsh,您可以执行以下操作:

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 -einbash或通过设置emacs,gmacsviin 选项ksh93(并且 stdin 是终端设备),但随后read会输出回声在标准错误上,而不是标准输出上。

相关内容