编写Bash脚本,从管道中读取输入

15

我想做类似于那样的事情:

cat file.txt | ./myscript.sh

file.txt

http://google.com
http://amazon.com
...

我该如何在myscript.sh中读取数据?

3个回答

16

您可以使用while循环(逐行处理)来完成此操作,这是这种情况的常见方式:

#!/bin/bash

while read a; do
    # something with "$a"
done

如需更多信息,请参阅http://mywiki.wooledge.org/BashFAQ/001


如果您想将整个文件读入一个变量中,则可以尝试执行以下操作:

#!/bin/bash

var="$(cat)"
echo "$var"
或者
#!/bin/bash

var="$(</dev/stdin)"
echo "$var"

如果你的脚本只是管道中的一部分,例如一个sed命令,你可以(在指定解释器#!/bin/bash之后)直接使用cat命令:cat|sed 's/abc/def/g' - valid

5

3
您可以使用以下方式让read接受管道输入:
echo "hello world" | { read test; echo test=$test; }

甚至可以编写如下函数:
read_from_pipe() { read "$@" <&0; }

这并不是"欺骗" read。问题不是从管道中读取数据,而是 read 设置的变量位于子shell中,在管道完成后就会消失。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接