1

我有几个 bash 脚本可以读取任意字符串(通常来自标准输入)。当这些字符串包含 bash 识别的内容时,事情就会中断。

例如,我有一个简单的日志记录脚本(名为 al),其主要功能是获取输入字符串并将其写入前面带有时间戳的文件。

如果我给它像

al that didn't work

或者

al I tried a & B

它中断是因为 bash 看到引号或与号(或其他元字符)并尝试在它到达我的脚本之前对其进行处理。

在我将字符串传递给脚本的其余部分之前,我想有一种方法来接受字符串并通过过滤器运行它以摆脱或添加转义符(“\”)到所有可能导致问题的字符。

我写了一个小 C 程序来做这件事——让它读取原始输入,所以 bash 永远不会看到它。它有效,但我真的不想重新发明轮子。

我知道我可以手动输入字符串并转义字符,但我通常会忘记这样做,有时它们会在以后被剥离。

al I tried a \& b
al It didn\'t work

是否有一些实用程序或方法可以做到这一点而无需从头开始编写?

4

1 回答 1

2

您是要在命令行上提供任意字符串,还是在脚本启动后作为输入(通过标准输入)?如果你试图在命令行上提供它,你就不能做你想做的事情(在脚本、C 程序,任何东西中),因为 shell总是在你的程序启动之前按照自己的规则解析命令行。

如果您在脚本启动后尝试将其作为输入读取,则使用该read命令相当容易,尽管有一些技巧可以正确获取“原始”输入。使用类似的东西:

IFS= read -r -p "Enter the string: " str

IFS=部分阻止它修剪空白;-r防止它解释转义。-p "Enter the string: "是一个可选的细节,如果合适,请随时将其关闭。

(顺便说一句,由于IFS=用作命令的前缀read,因此它仅适用于该命令,之后不必设置为正常。)

请注意,当使用变量 (str在这种情况下) 时,您应该始终将其括在双引号中 (例如echo "$str") 以防止 shell 在此时对其内容进行任何解析。实际上,无论如何,您几乎总是应该用双引号括起 shell 变量——我们在这里得到的解决方案是“双引号你的变量”的 shell 脚本问题的数量相当可怕。

于 2014-05-20T15:00:34.517 回答