curl
不解释反斜杠转义,因此您必须在参数中插入实际的换行符curl
看到了。换句话说,你必须获得外壳(bash
在这种情况下)来解释\n
,或者您需要插入一个真正的换行符。
Posix 标准 shell 不会像这样解释 C 转义符\n
,虽然标准实用程序命令printf
做。然而,bash
确实提供了一种方法:在报价单中$'...'
C 风格的反斜杠转义将被解释。否则,$'...'
行为就像'...'
,这样就不会发生参数和命令替换。
然而,任何外壳——包括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
命令并将已弃用的反引号命令替换更改为推荐的$(...)
form.)
如上所述,包含文字换行符的唯一问题是,如果您关心外观,它会扰乱缩进。所以你可能更喜欢 bash$'...'
form:
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