我在bash脚本中具有简单的功能,我想将stdout作为输入传递给它。

jc_hms(){
  printf "$1"
}

我想以这种方式使用它。
var=`echo "teststring" | jc_hms`

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

最初,jc_hms函数的用法如下:
echo `jc_hms "teststring"` > //dev/tts/0

但我想将结果存储在变量中,以便在将其发送到串行端口之前先进行进一步处理。

编辑:
因此请澄清一下,我不是要在串口上打印内容,如果要使用“|”,我想连接到bash函数竖线字符,我想知道是否可行。

编辑:好的,这是全部功能。
jc_hms(){
  hr=$(($1 / 3600))
  min=$(($1 / 60))
  sec=$(($1 % 60))

  printf "$hs:%02d:%02d" $min $sec
}

我正在使用该函数来形成字符串,这行代码
songplaytime=`echo $songtime | awk '{print S1 }'`
printstring="`jc_hms $songplaytime`"  #store resulting string in printstring

其中$ songtime是表示为“playtime totaltime”的字符串,由空格分隔。

我希望我可以在一行中完成此操作,并在awk之后将其发送
printstring=`echo $songtime | awk '{print S1 }' | jc_hms`

像这样

最佳答案

为了回答您的实际问题,当 shell 函数位于管道的接收端时,标准输入由该函数内部执行的第一个命令读取。由于printf是函数中的第一个也是唯一的命令,因此将忽略标准输入。有几种解决方法,包括使用内置的read将标准输入读取到可以传递给printf的变量中:

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

但是,由于您对管道的需求似乎取决于您对使用awk的需求,因此,我提出以下替代方案:
printstring=$( jc_hms $songtime )

由于songtime由一对空格分隔的数字组成,因此 shell 程序会对songtime的值进行单词拆分,并且jc_hms看到两个单独的参数。这不需要更改jc_hms的定义,也不需要通过标准输入将任何内容传递给它。

如果您仍然有其他原因让jc_hms读取标准输入,请告诉我们。

09-04 23:52