簡體   English   中英

如何在Bash腳本中用轉義版本替換特殊字符

[英]How do I substitute special characters with escaped version in a Bash script

我發誓我已經看了又看又看。 如果我在某個地方錯過了答案,我深表歉意。 這意味着我的搜索功能使我失敗了,而不是我沒有嘗試過。

我對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! 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腳本處理所不具有的其他功能,我寧願獲得確切的行號,因為我完全不熟悉它們。 (:嘆息:新手)

您可以嘗試使用printf

printf -v _INFO '%q' "$_INFO"

我認為這是正確的形式:

_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

正確的方法是:

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

僅有一種過濾用戶輸入的方法:使用白名單。 將黑名單永遠都行不通,因為您無法猜測用戶會想到的所有字符,尤其是在unicode中。 因此,如果您想安全起見,請使用允許的字符列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM