假设我有一个回显的脚本$1
#!/bin/bash
echo $1
它被称为test.sh
.然后我打电话/bin/test.sh 'test'
。输出是test
.但这不起作用:
/bin/test.sh 'te'st'
有语法错误。
这两个单引号之间可以有任何内容,例如
/bin/test.sh 'te"s"t'` or `/bin/test.sh 'te's't'` or `/bin/test.sh 'te"s't'
有办法解决这个问题吗?我只能使用引号。我无法改变变量内部的内容;这是一个日志解析。日志条目中可以包含任何内容。
我需要 bash 正确地接受这些参数。
例子:
/bin/test.sh '2015.11.11 07:45:44.060|executor-2|||ERROR|236 - PDF document for 5616904 wasn't created!'
这不起作用,因为'
单词中的单音不在字符串内。
字符串的放置方式与我写的完全一样。我将它与 Zabbix(监控解决方案)一起使用。所以在zabbix中是这样的:
/bin/test.sh '{$TRIGGER.VALUE}'
但最终{$TRIGGER.VALUE}
被替换为实际的字符串,并使用文字值调用脚本。
答案1
你的方法从根本上来说是有缺陷的。你把肉磨成汉堡包运输,最后你想把牛拿回来。不,那行不通。
不要将字符串直接注入 shell 命令,而是将其作为参数传递。我不熟悉 Zabbix,但查看文档,这似乎是它的工作原理(例如外部检查,用户参数:您指定一个命令及其所采用的参数。因此指定test.sh
为命令,并指定它获取的参数是 that "{TRIGGER.VALUE}"
。显然(再一次,我对 Zabbix 不熟悉),这意味着你写了类似的东西
test.sh["{TRIGGER.VALUE}"]
在 中test.sh
,要引用脚本的参数,请记住你需要写"$1"
,而不是$1
。
答案2
要将单引号放入命令行,请使用双引号或反斜杠:
test.sh "'test'"
test.sh \'test\'
但从你的帖子来看,你真正的问题似乎有所不同:
我无法更改变量内部的内容
如果变量中已经有一个字符串,只需双引号该变量即可传递其值不变。
test.sh "$var"