我在bash脚本中有一个简单的函数,我想将stdout作为输入传递给它.

jc_hms(){
  printf "$1"
}

我想这样使用它.

var=`echo "teststring" | jc_hms`

当然,我使用了冗余函数echo和printf来简化这个问题,但你明白了.现在我得到了一个"not found"错误,我认为这意味着我的参数定界是错误的("1美元"部分).有什么建议吗?

最初,jc_hms函数是这样使用的:

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

但我想先将结果存储在一个变量中,以便进一步处理,然后再将其发送到串行端口.

编辑:

编辑:好的,这是完整的功能.

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函数位于管道的接收端时,函数中的all个命令会继承标准输入,但只有实际读取其标准输入的命令才会使用任何数据.对于一个接一个运行的命令,以后的命令只能看到以前的命令没有使用的内容.当两个命令并行运行时,哪些命令查看哪些数据取决于操作系统如何调度命令.

由于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读取标准输入,请让我们知道.

Linux相关问答推荐

在Zenity进度窗口上单击取消后如何停止bash脚本

为什么Read()和cin.get()对输出缓冲区的影响不同?

如何将参数传递给Bash函数

当未在日志(log)中输入确切的时间戳时如何过滤日期范围内的值

当接收端未从套接字读取时,通过 Unix 套接字发送的消息会发生什么情况?

有什么方法可以知道在发送之前将在 TCP 上发送多少字节?

为什么 fork() 在 setsid() 之前

使用 AWS CLI 进行 Bash - 无法找到凭证

安装 mod_ssl 亚马逊 Linux

如何在 Linux 中使用命令行将 PDF 转换为 JPG?

如何克隆 OpenLDAP 数据库

Pthread mutex互斥断言错误

如果关键字触发然后执行命令,Shell 脚本来监视日志(log)文件?

Monit 守护程序 - 连接到 monit 守护程序时出错

将 jiffies 转换为毫秒

Windows 开发环境值得付出代价吗?

如何更改 tmux 会话的起始目录?

如何通过命令提示符判断 Linux 中的 BIOS 版本或名称?

Linux控制台中的模糊文件搜索

如何制作和应用SVN补丁?