我有一些bash函数,它们输出一些信息:
我一直在编写读取输出并过滤它的函数:
function filter-epson {
find-modelname-in-epson-ppds | sed <bla-blah-blah>
}
function filter-hp {
find-modelname-in-hp-ppds | sed <the same bla-blah-blah>
}
etc ...但我认为最好这样做:
function filter-general {
(somehow get input) | sed <bla-blah-blah>
}然后调用另一个高级函数:
function high-level-func {
# outputs filtered information
find-modelname-in-hp/epson/...-ppds | filter-general
}如何使用最佳bash实践来实现这一点?
发布于 2014-01-06 18:02:16
如果问题是How do I pass stdin to a bash function?,那么答案是:
Shellscript函数采用普通的方式,就好像它们是命令或程序一样。:)
input.txt:
HELLO WORLD
HELLO BOB
NO MATCHtest.sh:
#!/bin/sh
myfunction() {
grep HELLO
}
cat input.txt | myfunction输出:
hobbes@metalbaby:~/scratch$ ./test.sh
HELLO WORLD
HELLO BOB 请注意,命令行参数也是以普通方式处理的,如下所示:
test2.sh:
#!/bin/sh
myfunction() {
grep "$1"
}
cat input.txt | myfunction BOB输出:
hobbes@metalbaby:~/scratch/$ ./test2.sh
HELLO BOB 发布于 2012-12-23 07:51:32
为了让人痛苦地明白我是在从stdin那里流出来的,我有时会写
cat - | ...发布于 2019-10-18 14:27:11
非常简单的意味着将stdin输入到变量中,即使用read。默认情况下,它读取文件描述符"0",即stdin,即/dev/stdin。
示例功能:
input(){ local in; read in; echo you said $in; } 实例实现:
echo "Hello World" | input 结果:
你说世界好
更多信息
当然,您不需要将变量声明为本地变量。我只是为了保持良好的状态才把它包括在内。普通的老read in可以满足你的需要。
因此,您了解了read是如何工作的,默认情况下,它从给定的文件描述符(或隐式stdin)中读取数据,阻塞,直到遇到换行符。在大多数情况下,您会发现这将隐式地连接到您的输入,即使您没有意识到它。如果您有一个似乎与此机制挂起的函数,只需记住这个细节(有其他方法可以使用read来处理.)。
更稳健的解
添加到基本示例中,下面是允许通过stdin或参数传递输入的变体:
input()
{
local in=$1; if [ -z "$in" ]; then read in; fi
echo you said $in
}通过这种调整,您还可以调用以下函数:
input "Hello World"如何处理stdin选项加上其他参数?许多标准的nix实用程序,特别是那些通常与stdin/stdout一起工作的实用程序,遵循的是将破折号-处理为“默认”的一般做法,即上下文中的stdin或stdout,因此您可以遵循约定,并将指定为-的参数处理为"stdin":
input()
{
local a=$1; if [ "$a" == "-" ]; then read a; fi
local b=$2
echo you said $a $b
}把这叫做:
input "Hello" "World"或
echo "Hello" | input - "World"更进一步说,实际上没有理由只将stdin限制为第一个参数的选项!你可能会创建一个超级灵活的函数,可以将它用于任何一个.
input()
{
local a=$1; if [ "$a" == "-" ]; then read a; fi
local b=$2; if [ "$b" == "-" ]; then read b; fi
echo you said $a $b
}你为什么要那样?因为无论你需要什么论据,你都可以提出,并提出.
myFunc | input "Hello" -在这种情况下,我在第二个参数中使用myFunc的结果,而不是第一个参数的唯一选项。
https://stackoverflow.com/questions/14004756
复制相似问题