0

我目前正在编写一个 bash 脚本,它将使用 webhook 将当前时间戳和系统的 IP(运行 Ubuntu 18.04 LTS)发送到 Slack 通道,如下所示:

##!/bin/bash

command=(curl -X POST -H \'Content-type: application/json\' --data \'{\"text\":\")
command+=("$(date)")
command+=(" IP: ")
command+=("$(hostname -I)")
command+=(\"}\' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX)
"${command[@]}"

这意味着在允许可变时间戳和 IP 的同时复制以下工作命令:curl -X POST -H 'Content-type: application/json' --data '{"text":"Tue Jul 14 15:26:50 EDT 2020 IP: XX.X.X.XX"}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

这会返回一连串错误(此帖子的 IP 主机名已手动更改为 X):

curl: (6) Could not resolve host: application
curl: (3) Port number ended with ':'
curl: (3) Port number ended with ' '
curl: (3) Host name 'X.X.X.XX ' contains bad letter
curl: (3) [globbing] unmatched close brace/bracket in column 2

我能够确定替换"${command[@]}"echo "${command[@]}" | xclip -selection clipboard"然后手动将其粘贴到终端(右键单击-> 粘贴)效果很好。不幸的是,我第一个使用的想法xclip -selection clipboard -o似乎只是以相同的方式返回字符串echo "${command[@]}"

有没有办法以编程方式将剪贴板内容作为命令粘贴到 shell 中并执行它们,或者甚至可以调整初始"${command[@]}"调用以执行字符串?如果存在我没有看到的明显更好的方法,随时告诉我。

如果这对那些看到它的人来说是微不足道的,我提前道歉,但我对 Linux 系统和 bash 脚本都非常陌生。任何帮助将不胜感激。

4

1 回答 1

-1

问题是您创建了一个包含以下元素的数组(每行一个):

curl
-X
POST
-H
'Content-type:
application/json'
--data
'{"text":"
<output of date>
 IP:
<output of hostname -I>
"}'
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

因此,将此数组作为命令执行时,将'Content-type:, application/json', '{"text":", <output of date>, IP:等作为单独的命令参数。换句话说,command数组元素中的引号在"${command[@]}"扩展时对 bash 没有意义。当您将扩展结果复制并粘贴到终端时,bash 不再将其视为数组扩展的结果。相反,它将输入视为要解析为顶级命令的字符串,其中引号是有意义的。

要修复它,您只需要确保command数组的每个元素都对应于您打算执行的命令的参数:

command=(curl -X POST -H 'Content-type: application/json')
command+=(--data '{"text":"'"$(date)"' IP: '"$(hostname -I)"'"}')
command+=(https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX)
"${command[@]}"

最终,除非您需要该command数组用于脚本中的其他内容,否则您可以完全避免使用该数组及其替换:

curl \
    -X POST \
    -H 'Content-type: application/json' \
    --data '{"text":"'"$(date)"' IP: '"$(hostname -I)"'"}' \
    https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

逃逸--data无疑是令人困惑的;为了避免转义双引号,我混合了单引号和双引号字符串(在 bash 中将它们彼此相邻连接它们,即"foo"'bar'变为foobar)。

于 2020-07-15T04:55:03.623 回答