【发布时间】:2016-10-10 17:54:25
【问题描述】:
当我从 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
【问题讨论】:
-
尝试将多行参数括在三引号之间,'''like this'''
-
试过:sh -c 'command 1 2 '''long argument'''' 和 sh -c "command 1 2 '''long argument'''" 发生同样的事情。
-
sh -c $'testdollar.py 1 2 \'"A"||"B"||"C"\'' -
这行得通,但有什么办法可以让它在开头没有美元符号的情况下工作?
-
没有美元符号是它起作用的原因......
标签: bash