我正在尝试使用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
我宁愿直接推送消息,而不是通过文件。
答案 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