因此,我需要编写一个 Bourne-shell 脚本,其中我的脚本必须与该行一起工作,该行只是回显到标准输出 - 例如:
echo *something* | myscript.sh [parametres...]
这可能是一个基本的东西,是我在学习过程中可能忽略的东西。我会包括我的尝试,但它们远非解决方案。无论如何,任何提示表示赞赏。
答案1
这里要注意的关键是子级继承其父级的 STDIN/STDOUT/STDERR 文件描述符。这意味着,如果您启动一个脚本,其中 STDIN 连接到另一个进程(管道,例如您的示例)的 STDOUT,那么该脚本启动的任何内容也将其 STDIN 连接到另一个进程的同一 STDOUT。
意思是如果你做的echo foo | ./myscript.sh
地方myscript.sh
是:
#!/bin/bash
sed -e 's/foo/bar/'
然后sed
将从 STDOUT 读取echo foo
并写入 STDOUT(它将连接到您的 TTY,因为myscript.sh
启动时它没有重定向)。
例子:
$ echo foobar | ./myscript.sh
barbar
因此,如何使用它取决于您想要做什么。如果您只想将输入捕获到变量中,则可以使用read
内置函数来执行此操作。
例如:
#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"
结果是:
$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>
答案2
echo " foo bar " | {
# ...
IFS= read -r line
echo "$line"
}
答案3
管道左侧的标准输出连接到管道右侧的标准输入。在您的示例中, 的输出echo
成为 的输入myscript.sh
。
如果要将 的整个输出存储echo
到变量中,可以使用命令替换cat
。
whole_input=$(cat)
这会去除输入末尾的换行符。
read
如果您想一次读取一行,您也可以使用内置函数。请注意,plainread
将行分割成字段并使用反斜杠延续;要读取一行而不产生额外的复杂性,请使用IFS= read -r
:
IFS= read -r first_line
IFS= read -r second_line