1

我发誓我已经看了又看。如果我在某个地方错过了这个问题的答案,我深表歉意;这意味着我的搜索失败了,而不是我没有尝试过。

我对 bash 脚本比较陌生(:sigh: newbie),但我正在尝试编写一个从用户那里获取一些输入并在另一个命令中使用它的脚本。我的问题是其他命令需要在用户输入中转义任何特殊字符。

代码的基本形式如下:

#!/bin/bash

echo "Enter info:"
read _INFO

othercommand info=$_INFO 

readothercommand行之间,我需要进行按摩_INFO,以便任何特殊字符 - 空格、单引号和双引号......几乎所有非字母数字字符,真的 - 都被转义。例如,一个输入this pipe: | is my info!应该变成this\ pipe\:\ \|\ is\ my\ info\!

注意:我不能将引号 - 单引号或双引号 - 放入该othercommand行,因为它会导致命令失败。信息字符串需要保持原样,除了转义。

我尝试过以各种方式使用字符串替换宏(这里有一些只检查空格的例子):

_INFO = ${$_INFO// /\ }
_INFO = ${$_INFO// /\\ }
_INFO = ${$_INFO//" "/"\ "}
_INFO = ${$_INFO//" "/"\\ "}
_INFO = ${$_INFO//' '/'\ '}
_INFO = ${$_INFO//' '/'\\ '}

但我不断收到“错误替换”错误。

因此,这不仅过于具体(仅处理空格)而且无论如何都不起作用。我该怎么做呢?

如果我必须使用sedawk其他非 bash 脚本处理原生的东西,我宁愿得到我需要使用的确切行,因为我完全不熟悉它们。(:叹息:新手)

4

3 回答 3

2

你可以试试printf

printf -v _INFO '%q' "$_INFO"
于 2013-09-12T20:03:45.353 回答
1

我认为这是正确的形式:

_INFO=${_INFO// /\ }
_INFO=${_INFO// /\\ }
_INFO=${_INFO//" "/"\ "}
_INFO=${_INFO//" "/"\\ "}
_INFO=${_INFO//' '/'\ '}
_INFO=${_INFO//' '/'\\ '}

当使用参数替换形式${parameter/pattern/string}时,你不应该$在你的参数里面添加{}

在此处查看有关参数扩展的更多信息:http ://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

于 2013-09-12T19:08:43.660 回答
0

正确的做法是:

_INFO=${_INFO//[^a-zA-Z]/}

过滤用户输入的方法只有一种:使用白名单。黑名单永远不会起作用,因为您无法猜测用户可能想到的所有字符,尤其是在 unicode 中。因此,如果您想安全起见,请使用允许的字符列表。

于 2013-09-12T19:10:04.837 回答