pipe道输出到bashfunction

我有一个简单的function,在一个bash脚本,我想输出stdout作为input。

jc_hms(){ printf "$1" } 

我想以这种方式使用它。

 var=`echo "teststring" | jc_hms` 

当然我用冗余函数echo和printf来简化问题,但是你明白了。 现在我得到一个“未find”的错误,我认为这意味着我的参数分隔是错误的(“$ 1”部分)。 有什么build议么?

最初的jc_hmsfunction是这样使用的:

 echo `jc_hms "teststring"` > //dev/tts/0 

但我想将结果存储在一个variables中,以便进一步处理,然后再发送到串口。

编辑:所以澄清,我不是试图打印的东西串口,我想接口我的bash函数应该“|” pipe道字符,我想知道这是否可能。

编辑:好的,这是完整的function。

 jc_hms(){ hr=$(($1 / 3600)) min=$(($1 / 60)) sec=$(($1 % 60)) printf "$hs:%02d:%02d" $min $sec } 

我正在使用函数来形成一个string来代码的这一行

 songplaytime=`echo $songtime | awk '{print S1 }'` printstring="`jc_hms $songplaytime`" #store resulting string in printstring 

其中$ songtime是一个表示为“playtime totaltime”的string,由空格分隔。

我希望我可以在一行中做到这一点,并在awk之后进行pipe理

 printstring=`echo $songtime | awk '{print S1 }' | jc_hms` 

像这样。

要回答你的实际问题,当一个shell函数在一个pipe道的接收端时,标准input被在函数内执行的第一个命令读取。 由于printfprintf中的第一个也是唯一的命令,所以标准input被忽略。 有几种方法,包括使用read内置的标准input读取到可以传递给printf的variables:

 jc_hms () { read foo hr=$(($1 / 3600)) min=$(($1 / 60)) sec=$(($1 % 60)) printf "$hs:%02d:%02d" $min $sec } 

但是,由于您对pipe道的需求似乎取决于您认为需要使用awk ,请让我build议以下方法:

 printstring=$( jc_hms $songtime ) 

由于songtime由一对空格分隔的数字组成的,因此shell songtime的值进行分词, jc_hms看到两个单独的参数。 这不需要改变jc_hms的定义,也不需要通过标准的input来input任何东西。

如果您对jc_hms阅读标准input的理由不同,请告诉我们。

你不能直接把东西pipe道到这样的bash函数,但是你可以使用read来取而代之:

 jc_hms(){ while read data; do printf "%s" "$data" done } 

应该是你想要的

1)我知道这是一个很老的post

2)我喜欢这里的大部分答案

但是,我发现这篇文章,因为我需要类似的东西。 尽pipe每个人都同意stdin是需要使用的,但是这里缺less的答案是/ dev / stdin文件的实际用法。

使用read内build强制该function与pipe道input一起使用,因此不能再以典型方式使用。 我认为使用/ dev / stdin是解决这个问题的最好方法,所以我想增加我的2分钱来完成。

我的解决scheme

 jc_hms() { declare -ii=${1:-$(</dev/stdin)}; declare hr=$(($i/3600)) min=$(($i/60%60)) sec=$(($i%60)); printf "%02d:%02d:%02d\n" $hr $min $sec; } 

在行动:

 user@hostname:pwd$ jc_hms 7800 02:10:00 user@hostname:pwd$ echo 7800 | jc_hms 02:10:00 

我希望这可以帮助某人。

快乐的黑客!

或者,你也可以用简单的方法做到这一点。

 jc_hms() { cat } 

虽然迄今为止所有的答案都忽视了这不是OP所要求的事实(他说function简化了)

我喜欢user.friendly的答案使用Bash内置的条件unsetreplace语法。 这里有一个小小的调整来使他的答案更具有通用性,比如具有不确定参数的情况:

 function myfunc() { declare MY_INPUT=${*:-$(</dev/stdin)} for PARAM in $MY_INPUT; do # do what needs to be done on each input value done } 

Hmmmm ….

 songplaytime=`echo $songtime | awk '{print S1 }'` printstring="`jc_hms $songplaytime`" #store resulting string in printstring 

如果你正在调用awk,为什么不使用它?

 printstring=`TZ=UTC gawk -vT=$songplaytime 'BEGIN{print strftime("%T",T)}'` 

我假设你使用Gnu的Awk,这是最好的,也是免费的; 这将在通用的Linux发行版中工作,这些发行版不一定使用最新的gawk。 最新版本的gawk将让你指定UTC作为strftime()函数的第三个参数。