我发誓我看了看,看了看。如果我错过了某个地方的答案,我道歉;这意味着我的搜索失败了,而不是我没有尝试过。
我对bash脚本相对较新(:叹气:新手),但我正在尝试编写一个从用户那里获得一些输入并在另一个命令中使用它的人。我的问题是另一个命令需要在用户输入转义中包含任何特殊字符。
代码的基本形式如下:
#!/bin/bash
echo "Enter info:"
read _INFO
othercommand info=$_INFO
在read
和othercommand
行之间,我需要按下_INFO
以便任何特殊字符 - 空格,单引号和双引号...几乎所有非字母数字字符,真的 - 逃脱了。例如,this pipe: | is my info!
的输入应变为this\ pipe\:\ \|\ is\ my\ info\!
注意:我不能将引号(单引号或双引号)放入othercommand
行,因为它会导致命令失败。信息字符串需要按原样运行,但转义除外。
我尝试过以各种方式使用字符串替换宏(以下是一些仅检查空格的示例):
_INFO = ${$_INFO// /\ }
_INFO = ${$_INFO// /\\ }
_INFO = ${$_INFO//" "/"\ "}
_INFO = ${$_INFO//" "/"\\ "}
_INFO = ${$_INFO//' '/'\ '}
_INFO = ${$_INFO//' '/'\\ '}
但我一直遇到“糟糕的替代”错误。
所以,这不仅太具体(只处理空格),而且无论如何都不起作用。我该怎么做?
如果我必须使用sed
或awk
或其他非本地的bash脚本处理,我宁愿给出我需要使用的确切行,因为我'我完全不熟悉他们。 (:叹气:新手)
答案 0 :(得分:2)
您可以尝试printf
:
printf -v _INFO '%q' "$_INFO"
答案 1 :(得分: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
答案 2 :(得分:0)
正确的方法是:
_INFO=${_INFO//[^a-zA-Z]/}
只有一种方法可以过滤用户输入:使用白名单。黑名单永远不会起作用,因为您无法猜测用户可能会想到的所有字符,尤其是在unicode中。因此,如果您想要安全,请使用允许的字符列表。