Linux bash脚本修改以从echo命令获取参数

Linux bash脚本修改以从echo命令获取参数,linux,bash,email,mandrill,getopt,Linux,Bash,Email,Mandrill,Getopt,我有一个小的bash脚本(sendmail.sh)来发送电子邮件,当像这样使用/sendmail.sh”时,它会工作得很好my@email.com“电子邮件主题”“电子邮件正文”。不过,多亏了,我希望这个脚本从echo命令获取其电子邮件正文,就像linux邮件命令一样回显“电子邮件正文”|邮件-s“电子邮件主题”email@any.com 当我将下面的脚本用于此命令时,echo“email body”|/sendmail.shmy@email.com“Email Subject”它打印在else

我有一个小的bash脚本(sendmail.sh)来发送电子邮件,当像这样使用
/sendmail.sh”时,它会工作得很好my@email.com“电子邮件主题”“电子邮件正文”
。不过,多亏了,我希望这个脚本从echo命令获取其电子邮件正文,就像linux邮件命令一样<代码>回显“电子邮件正文”|邮件-s“电子邮件主题”email@any.com

当我将下面的脚本用于此命令时,
echo“email body”|/sendmail.shmy@email.com“Email Subject”
它打印在else块中指定的错误(因为只给出了2个参数,但需要3个)
/sendmail.sh需要3个参数-地址、主题和内容
示例:.//sendmail.sh“发送至”-address@mail-address.com“test”您好这是一条测试消息“

惊讶地发现为什么脚本中的
echo
commands输出没有作为$3参数的输入

#!/bin/bash
#created by black @ LET
#MIT license, please give credit if you use this for your own projects
#depends on curl

key="" #your maildrill API key
from_email="" #who is sending the email
reply_to="$from_email" #reply email address
from_name="curl sender" #from name


if [ $# -eq 3 ]; then
    msg='{ "async": false, "key": "'$key'", "message": { "from_email": "'$from_email'", "from_name": "'$from_name'", "headers": { "Reply-To": "'$reply_to'" }, "return_path_domain": null, "subject": "'$2'", "text": "'$3'", "to": [ { "email": "'$1'", "type": "to" } ] } }'
    results=$(curl -A 'Mandrill-Curl/1.0' -d "$msg" 'https://mandrillapp.com/api/1.0/messages/send.json' -s 2>&1);
    echo "$results" | grep "sent" -q;
    if [ $? -ne 0 ]; then
        echo "An error occured: $results";
        exit 2;
    fi
else
echo "$0 requires 3 arguments - to address, subject, content";
echo "Example: ./$0 \"to-address@mail-address.com\" \"test\" \"hello this is a test message\""
exit 1;
fi

为什么这令人惊讶?您将参数和标准输入混合在一起,这两者从根本上是完全不同的

然而,适应这一要求并不难

case $# in
   3) text="$3" ;;
   2) text=$(cat) ;;
esac
: .... do stuff with "$text"
您的脚本的缩进和引用有点马虎,所以这里有一个经过重构的版本

key="" #your maildrill API key
from_email="" #who is sending the email
from_name="curl sender" #from name

case $# in
  3) text="$3";;
  2) text="$(cat)";;
  *) echo "$0: oops!  Need 2 or 3 arguments -- aborting" >&2; exit 1 ;;
esac

msg='{ "async": false, "key": "'"$key"'", "message": { "from_email": "'"$from_email"'", "from_name": "'"$from_name"'", "return_path_domain": null, "subject": "'"$2"'", "text": "'"$text"'", "to": [ { "email": "'"$1"'", "type": "to" } ] } }'
result=$(curl -A 'Mandrill-Curl/1.0' -d "$msg" 'https://mandrillapp.com/api/1.0/messages/send.json' -s 2>&1)
case $results in
  *"sent"*) exit 0;;
  *) echo "$0: error: $results" >&2; exit 2;;
esac
请特别注意,任何用户提供的字符串都必须完全位于双引号内


(我拿出了
回复:
,因为当它等于
发件人:
标题时,它是完全多余的。)

谢谢。你的解决办法奏效了。是的,我把两者混在一起,结果弄错了。