假设我在脚本中定义了这个函数:
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
而不是将其存储在变量中,而是将其用作命令?
谢谢。
如果您希望消息从 stdin 中作为一行读取(当脚本在终端中使用时由用户输入),然后作为参数传递给函数,您可以执行以下操作:
line
不再是标准命令,但仍然相当普遍。您可以将其替换为head -n1
,但对于某些实现,当输入不是来自终端设备时,它可以读取多行(尽管它只输出一行)。使用
bash
'时,read
您必须将其存储在变量中。这就是read
将输入存储在变量中的目的。使用
zsh
'sread
,您可以使用回显读取数据的选项-e
而不是将其存储在变量中,因此上面可以写成:line
IFS= read -re
(这比使用
read
变量效率低,因为我们需要 fork 一个进程以便 zsh 可以读取read
的输出)。当然,您也可以替换您的:
和
该
read
实用程序不允许使用回调(我不确定任何常见的 Unix 工具是否允许)。此外,它不会输出读取的数据。您需要做的是将
read
调用包装在一个函数中,该函数接受用户提供的内容并按照您的描述将其输出。或者,使用其他工具读取输入并生成所需的输出,例如awk
.此外,一般来说,using
variable=$@
的定义并不明确。如果您希望命令行参数作为以空格分隔的值列表,variable="$*"
请改用(假设IFS
变量的默认值)。这是一个非常不寻常的请求......嗯......为了从终端获得一些输入到该函数的位置参数列表中,尝试
cat
在您输入 EOF (CTRL-D) 字符之前,它会一直显示。确保vert
变量设置tru
在函数外部。