使用sh -c转义特殊字符

时间:2016-10-10 08:41:11

标签: bash

当我从shell运行以下命令时,它可以正常工作:

# ./testdollar.py 1 2 '"source"="Zabbix"|| "name"="testlog trigger"|| "trigger_name"="*UNKNOWN*"|| "trigger_group"="Zabbix servers"|| "trigger_description"=""|| "id"="291058"|| "item_name"="Testlog"|| "item_value"="HFD3D$01"|| "item_lastvalue"="HFD3D$01"|| "reference_url"="http://test"|| "status_open"="1"|| "hostname"="Zabbix server"||
"ip"="10.10.10.1"|| "value"="1"|| "event_id"="62510700"|| "severity"="Not classified"||
"datetime_item_cst"="1969.12.31 18:00:00"|| "datetime_cst"="2016.10.07 03:59:08"|| "sourceid"="62510700"'

但我需要将其作为:

运行

sh -c“带参数的整个命令”

我试过这个:

sh -c /data/zabbix/share/zabbix/alertscripts/testdollar.py 1 2 '"source"="Zabbix"|| "name"="testlog trigger"|| "trigger_name"="*UNKNOWN*"|| "trigger_group"="Zabbix servers"|| "trigger_description"=""|| "id"="291058"|| "item_name"="Testlog"|| "item_value"="HFD3D$01"|| "item_lastvalue"="HFD3D$01"|| "reference_url"="http://test"|| "status_open"="1"|| "hostname"="Zabbix server"||
"ip"="10.10.10.1"|| "value"="1"|| "event_id"="62510700"|| "severity"="Not classified"||
"datetime_item_cst"="1969.12.31 18:00:00"|| "datetime_cst"="2016.10.07 03:59:08"|| "sourceid"="62510700"'

给出以下错误,表示它无法读取包含大量引号的第三个参数:

Traceback (most recent call last):
  File "/data/zabbix/share/zabbix/alertscripts/testdollar.py", line 3, in <module>
    data=sys.argv[3]
IndexError: list index out of range

试过这个:

sh -c '/data/zabbix/share/zabbix/alertscripts/testdollar.py 1 2 "source"="Zabbix"|| "name"="testlog trigger"|| "trigger_name"="*UNKNOWN*"|| "trigger_group"="Zabbix servers"|| "trigger_description"=""|| "id"="291058"|| "item_name"="Testlog"|| "item_value"="HFD3D$01"|| "item_lastvalue"="HFD3D$01"|| "reference_url"="http://test"|| "status_open"="1"|| "hostname"="Zabbix server"||
"ip"="10.10.10.1"|| "value"="1"|| "event_id"="62510700"|| "severity"="Not classified"||
"datetime_item_cst"="1969.12.31 18:00:00"|| "datetime_cst"="2016.10.07 03:59:08"|| "sourceid"="62510700"'

哪个运行正常但是当我检查命令的结果时,我可以看到它在“source”=“Zabbix”||之后停止读取第三个参数部分。如果我用双引号而不是单引号包装整个事件,也会发生同样的事情。

尝试使用单引号和双引号的其他组合但无法弄明白。我是否需要在命令参数中转义特殊字符?如果是这样,怎么样?

编辑:

更容易测试:

sh -c 'echo '"A=x"||"B=y"||"C=z"''
A=x

1 个答案:

答案 0 :(得分:1)

您应该在整个命令周围使用双引号,然后在命令字符串中转义双引号:

sh -c "echo '\"A=x\"||\"B=y\"||\"C=z\"'"

请记住,参数将在双引号内展开,因此如果字符串中有$,那么您需要将它们转义\$

替代方案并不特别吸引人:

sh -c 'echo '"'"'"A=x"||"B=y"||"C=z"'"'"''

要在单引号字符串中使用单引号''"'"'会关闭原始字符串,插入双引号单引号,然后重新打开单引号字符串。

如果你专门针对Bash,那么你也可以使用“C风格”/ ANSI字符串:

sh -c $'echo \'"A=x"||"B=y"||"C=z"\''

$' '内,可以使用\'插入单引号。