gpt4 book ai didi

linux - 将任意字符串(从标准输入或文件)读入 bash 并在不进行任何 shell 扩展的情况下使用它

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:52 25 4
gpt4 key购买 nike

我有几个 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

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

最佳答案

您是想在命令行上提供任意字符串,还是在脚本启动后作为输入(通过标准输入)?如果你试图在命令行上提供它,你就不能做你想做的事情(在脚本、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 脚本问题的数量是“用双引号引起来的变量”,这相当可怕。

关于linux - 将任意字符串(从标准输入或文件)读入 bash 并在不进行任何 shell 扩展的情况下使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23752144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com