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被在函数内执行的第一个命令读取。 由于printf
是printf
中的第一个也是唯一的命令,所以标准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()函数的第三个参数。