连接两个Bash命令

时间:2009-10-25 18:34:38

标签: bash scripting command pipe

我有Ubuntu Linux。我发现一个命令可以让我从Gmail下载未读邮件主题:

curl -u USERNAME:PASSWORD --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"

...然后另一个让我轻松发送邮件的命令(一旦我通过apt-get安装了sendemail命令):

sendEmail -f EMAIL@DOMAIN.COM -v -t PHONE@SMS.COM -u Gmail Notifier -m test -s MAILSERVER:PORT -xu EMAIL@DOMAIN.COM -xp PASSWORD

(请注意,在制作中我可能会将-v与上面的-q交换。)

因此,如果一个命令下载一行主题,我该如何将它们传递到sendEmail命令?

例如,我尝试在两者之间使用管道字符,我在-m参数后使用“$ 1”,但发生的事情是,当我没有未读电子邮件时,它仍然会向我发送至少一条空消息。

如果您对此有所帮助,我将使用此信息在StackOverflow上分享如何构建可以在手机上连接短信的Gmail通知程序。

5 个答案:

答案 0 :(得分:1)

试试这个结构:

while read line
do
    sendemailcommand ... -m $line ...
done < <(curlcommand)

答案 1 :(得分:1)

你知道你可以使用过滤器和你的短信电子邮件网关直接在gmail中做到这一点,对吗?

但回到问题......

您可以使用以下设计模式在shell脚本中获取对命令输出的控制权:

command1 | while read a b c restofline; do
    : execute commands here
    : command2
done

阅读将第一个单词放在a中,第二个单词放在b中,其余部分放在restofline中。如果循环只包含一个命令,那么xargs程序可能就是你想要的。请特别阅读-I参数,该参数允许您将替换参数放在命令中的任何位置。

有时循环看起来像... | while read x; do,它将整行放入x

答案 2 :(得分:1)

我想如果你混合使用viraptor&amp; DigitalRoss'回答你得到你想要的。我通过使用以下输入创建一个假文件来创建一个示例测试:

文件内容:

foo

bar

baz

然后我运行了这个命令:

% cat ~/tmp/baz | while read x; do if [[ $x != "" ]]; then echo "x: '$x'"; fi; done

这只会打印输出输出的行。我不熟悉sendEmail;它是否需要身体在stdin上或者你能否在cmdline上传递它?

答案 3 :(得分:0)

我会查看xargs命令,它提供了您需要的所有功能(据我所知)。

http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs

答案 4 :(得分:0)

也许是这样的:

curl_command > some_file
if [[ `wc -l some_file` != "0 some_file" ]] ; then
  email_command < some_file
fi