![将读取命令的输入视为命令本身](https://linux22.com/image/139037/%E5%B0%86%E8%AF%BB%E5%8F%96%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%85%A5%E8%A7%86%E4%B8%BA%E5%91%BD%E4%BB%A4%E6%9C%AC%E8%BA%AB.png)
假设我在脚本中定义了这个函数:
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
函数外部。