卷曲-F换行未正确解释

时间:2014-05-29 12:03:59

标签: bash curl terminal pushover

我正在尝试使用bash脚本中的curl通过pushover发送通知。 我不能让curl -F正确解释换行符。

curl -s \
-F "token=TOKEN" \
-F "user=USER" \
-F "message=Root Shell Access on HOST \n `date` \n `who` " \
https://api.pushover.net/1/messages.json > NUL

我试过了:

\n 
\\\n 
%A0

我宁愿直接推送消息,而不是通过文件。

1 个答案:

答案 0 :(得分:5)

curl不解释反斜杠转义,因此您必须在curl看到的参数中插入实际换行符。换句话说,你必须获得shell(在这种情况下为bash)来解释\n,或者你需要插入一个真正的换行符。

尽管标准实用程序命令\n有效,但Posix标准shell不会解释printf之类的C转义。但是,bash确实提供了一种方法:在引用形式$'...'中,C样式的反斜杠转义将是解释器。否则,$'...'就像'...'一样,因此不会发生参数和命令替换。

但是,任何shell(包括bash)都允许换行符出现在引号内,换行符只是按原样传递。所以你可以写:

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST
$(date)
$(who)
" \
     https://api.pushover.net/1/messages.json > /dev/null

(注意:我在原始curl命令中似乎缺少参数扩展,并将已弃用的反引号命令替换为推荐的$(...)表单。)

如上所述,包含文字换行符的唯一问题是,如果你关心外表,它会弄乱缩进。所以你可能更喜欢bash的$'...'形式:

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST"$'\n'"$(date)"$'\n'"$(who)" \
     https://api.pushover.net/1/messages.json > /dev/null

这也有点难以阅读,但它完全合法。 shell允许单个参数(" word")由任意数量的引用或不引用的段组成,只要段之间没有空格即可。但是你可以通过预定义变量来避免多引号语法,有些人发现变量更具可读性:

NL=$'\n'
curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "message=Root Shell Access on $HOST$NL$(date)$NL$(who)" \
     https://api.pushover.net/1/messages.json > /dev/null

最后,如果您更习惯这种风格,可以使用标准实用程序printf

curl -s \
     -F "token=$TOKEN" \
     -F "user=$USER" \
     -F "$(printf "message=Root Shell Access on %s\n%s\n%s\n" \
                  "$HOST" "$(date)" "$(who)")" \
     https://api.pushover.net/1/messages.json > /dev/null