将变量传递给 bash 脚本时如何转义单引号或双引号?

将变量传递给 bash 脚本时如何转义单引号或双引号?

假设我有一个回显的脚本$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"

相关内容