首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash脚本中读取函数中的stdin

在bash脚本中读取函数中的stdin
EN

Stack Overflow用户
提问于 2012-12-22 17:02:28
回答 4查看 44K关注 0票数 64

我有一些bash函数,它们输出一些信息:

  • find-modelname-in-epson-ppds
  • find-modelname-in-samsung-ppds
  • find-modelname-in-hp-ppds
  • 等等..。

我一直在编写读取输出并过滤它的函数:

代码语言:javascript
复制
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 ...

但我认为最好这样做:

代码语言:javascript
复制
function filter-general {
    (somehow get input) | sed <bla-blah-blah>
}

然后调用另一个高级函数:

代码语言:javascript
复制
function high-level-func {
    # outputs filtered information
    find-modelname-in-hp/epson/...-ppds | filter-general 
}

如何使用最佳bash实践来实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-06 18:02:16

如果问题是How do I pass stdin to a bash function?,那么答案是:

Shellscript函数采用普通的方式,就好像它们是命令或程序一样。:)

input.txt:

代码语言:javascript
复制
HELLO WORLD
HELLO BOB
NO MATCH

test.sh:

代码语言:javascript
复制
#!/bin/sh

myfunction() {
    grep HELLO
}

cat input.txt | myfunction

输出:

代码语言:javascript
复制
hobbes@metalbaby:~/scratch$ ./test.sh 
 HELLO WORLD 
 HELLO BOB 

请注意,命令行参数也是以普通方式处理的,如下所示:

test2.sh:

代码语言:javascript
复制
#!/bin/sh

myfunction() {
    grep "$1"
}

cat input.txt | myfunction BOB

输出:

代码语言:javascript
复制
hobbes@metalbaby:~/scratch/$ ./test2.sh 
 HELLO BOB 
票数 82
EN

Stack Overflow用户

发布于 2012-12-23 07:51:32

为了让人痛苦地明白我是在从stdin那里流出来的,我有时会写

代码语言:javascript
复制
cat - | ...
票数 31
EN

Stack Overflow用户

发布于 2019-10-18 14:27:11

非常简单的意味着将stdin输入到变量中,即使用read。默认情况下,它读取文件描述符"0",即stdin,即/dev/stdin

示例功能:

代码语言:javascript
复制
input(){ local in; read in; echo you said $in; }                    

实例实现:

代码语言:javascript
复制
echo "Hello World" | input               

结果:

你说世界好

更多信息

当然,您不需要将变量声明为本地变量。我只是为了保持良好的状态才把它包括在内。普通的老read in可以满足你的需要。

因此,您了解了read是如何工作的,默认情况下,它从给定的文件描述符(或隐式stdin)中读取数据,阻塞,直到遇到换行符。在大多数情况下,您会发现这将隐式地连接到您的输入,即使您没有意识到它。如果您有一个似乎与此机制挂起的函数,只需记住这个细节(有其他方法可以使用read来处理.)。

更稳健的解

添加到基本示例中,下面是允许通过stdin或参数传递输入的变体:

代码语言:javascript
复制
input()
{ 
    local in=$1; if [ -z "$in" ]; then read in; fi
    echo you said $in
}

通过这种调整,您还可以调用以下函数:

代码语言:javascript
复制
input "Hello World"

如何处理stdin选项加上其他参数?许多标准的nix实用程序,特别是那些通常与stdin/stdout一起工作的实用程序,遵循的是将破折号-处理为“默认”的一般做法,即上下文中的stdin或stdout,因此您可以遵循约定,并将指定为-的参数处理为"stdin":

代码语言:javascript
复制
input()
{ 
    local a=$1; if [ "$a" == "-" ]; then read a; fi
    local b=$2
    echo you said $a $b
}

把这叫做:

代码语言:javascript
复制
input "Hello" "World"

代码语言:javascript
复制
echo "Hello" | input - "World"

更进一步说,实际上没有理由只将stdin限制为第一个参数的选项!你可能会创建一个超级灵活的函数,可以将它用于任何一个.

代码语言:javascript
复制
input()
{ 
    local a=$1; if [ "$a" == "-" ]; then read a; fi
    local b=$2; if [ "$b" == "-" ]; then read b; fi
    echo you said $a $b
}

你为什么要那样?因为无论你需要什么论据,你都可以提出,并提出.

代码语言:javascript
复制
myFunc | input "Hello" -

在这种情况下,我在第二个参数中使用myFunc的结果,而不是第一个参数的唯一选项。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14004756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档