当我从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
答案 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"\''
在$' '
内,可以使用\'
插入单引号。