Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在Bash脚本中用转义版本替换特殊字符_Linux_Bash_String Substitution - Fatal编程技术网

Linux 如何在Bash脚本中用转义版本替换特殊字符

Linux 如何在Bash脚本中用转义版本替换特殊字符,linux,bash,string-substitution,Linux,Bash,String Substitution,我发誓我看了又看又看。如果我在什么地方错过了答案,我道歉;这意味着我的搜索失败了,不是说我没有尝试过 我对bash脚本比较陌生(:sigh:newbie),但我正在尝试编写一个从用户那里获取一些输入并在另一个命令中使用它的脚本。我的问题是另一个命令需要在用户输入中转义任何特殊字符 守则的基本形式如下: #!/bin/bash echo "Enter info:" read _INFO othercommand info=$_INFO 在read和othercommand行之间,我需要对\

我发誓我看了又看又看。如果我在什么地方错过了答案,我道歉;这意味着我的搜索失败了,不是说我没有尝试过

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

守则的基本形式如下:

#!/bin/bash

echo "Enter info:"
read _INFO

othercommand info=$_INFO 
read
othercommand
行之间,我需要对
\u INFO
进行按摩,以便任何特殊字符-空格、单引号和双引号。。。实际上,几乎所有的非字母数字字符都是转义的。例如,
这个管道的输入:|是我的信息应该变成
this\pipe\:\\\\124;\ is\my\info\

注意:我不能在
othercommand
行中添加单引号或双引号,因为这会导致命令失败。信息字符串需要保持原样,但转义除外

我尝试过以各种方式使用字符串替换宏(以下是一些仅检查空格的示例):

但我总是会犯“糟糕的替换”错误

所以,这不仅太具体了(只处理空格),而且根本不起作用。我该怎么做


如果我必须使用
sed
awk
或其他不是bash脚本处理所固有的东西,我更希望得到我需要使用的确切行,因为我对它们完全不熟悉。(:叹气:新手)

我认为这是合适的形式:

_INFO=${_INFO// /\ }
_INFO=${_INFO// /\\ }
_INFO=${_INFO//" "/"\ "}
_INFO=${_INFO//" "/"\\ "}
_INFO=${_INFO//' '/'\ '}
_INFO=${_INFO//' '/'\\ '}
printf -v _INFO '%q' "$_INFO"
使用参数替换形式
${parameter/pattern/string}
时,不应在
{}
中的参数之前添加
$

有关参数扩展的更多信息,请参见此处:

正确的方法是:

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

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

您可以尝试使用
printf

_INFO=${_INFO// /\ }
_INFO=${_INFO// /\\ }
_INFO=${_INFO//" "/"\ "}
_INFO=${_INFO//" "/"\\ "}
_INFO=${_INFO//' '/'\ '}
_INFO=${_INFO//' '/'\\ '}
printf -v _INFO '%q' "$_INFO"

这将删除有问题的字符,但不会用转义的等效字符替换它们。我该怎么做?@WilsonF什么?如何转义每个unicode字符?你打算怎么逃过这一劫<代码>‫‬‭‮‪‫‬‭‮҉这怎么办?这就是我想知道的。“你的问题是一种修辞方式,表示它不可能完成吗?”威尔森夫甚至没有回答。除非您真的告诉我们如何处理您的数据,否则除了删除它们之外别无选择。也许你想把它传给wget?我试过了,但是我得到了“command not found”错误。这是一个很好的链接,谢谢@WilsonF请确保不要复制CRLF格式的行。它应该与Bash配合使用。欢迎。啊,这很可能就是问题所在。宾果!这正是我所需要的;它工作得很好。我见过printf的一些解决方案,但没有看到“-v”参数。非常感谢你!