脚本需要读取回显行

脚本需要读取回显行

因此,我需要编写一个 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

相关内容