将读取命令的输入视为命令本身

将读取命令的输入视为命令本身

假设我在脚本中定义了这个函数:

fct1() {
  local msg1=${@}
if [[ "${verb}" = 'tru' ]]; then
  echo "I say $msg1"
  sleep 1
  echo "i repeat"
  sleep 1
  echo "I saaaaaaaaay $msg1"
else
  echo "$msg1"
fi
}

我将如何让用户从 调用此函数read

我在想类似的事情

read fct1 "aha aha ahaaaaa"

输出将是:

"I say aha aha ahaaaaa" "I repeat" "I saaaaaaaaay aha aha ahaaaaa"

基本上,如何使用输入read而不将其存储在变量中,而是将其用作命令?

谢谢。

答案1

如果您希望消息从 stdin 读取为一行(在终端中使用脚本时由用户输入),然后作为参数传递给函数,您可以这样做:

fct1 "$(line)"

line不再是标准命令,但仍然相当普遍。您可以将其替换为head -n1,但对于某些实现,当输入不是来自终端设备时,它可以读取多于一行(尽管它只输出一行)。

使用bash's时read,您必须将其存储在变量中。这就是read将输入存储在变量中的目的。

IFS= read -r line && fct1 "$line"

通过zsh's read,您可以使用-e以下选项回声读取数据而不是将其存储在变量中,因此line上面可以写为IFS= read -re

fct1 "$(IFS= read -re)"

(这比使用read变量的效率低,因为我们需要分叉一个进程,以便 zsh 可以读取read的输出)。

当然,您也可以替换您的:

local msg1=${@}

local msg1; IFS= read -r msg1 || return

答案2

read实用程序不允许使用回调(我不确定任何常见的 Unix 工具都允许)。此外,它不会输出读取的数据。

您需要做的是将调用包装read在一个函数中,该函数接受用户提供的内容并按照您的描述将其输出回来。或者,使用其他工具读取输入并生成所需的输出,例如awk.

另外,一般来说,使用variable=$@并没有明确的定义。如果您希望命令行参数作为空格分隔值的列表,请改用variable="$*"(假设变量的默认值IFS)。

答案3

这是一个非常不寻常的请求...嗯...为了从终端获取一些输入到该函数的位置参数列表中,请尝试

fct1 "$(cat)"
dfergerg
I say dfergerg
i repeat
I saaaaaaaaay dfergerg

它将一直cat持续,直到您输入 EOF (CTRL-D) 字符。确保vert变量设置在tru函数外部。

相关内容