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//' '/'\\ '}

しかし、「悪い置換」エラーが発生し続けます。

したがって、これは具体的すぎる (スペースのみを処理する) だけでなく、とにかく機能しません。どうすればいいですか?

sedまたは、bash スクリプト処理にネイティブではない何かを使用awkする必要がある場合は、完全に慣れていないため、使用する必要がある正確な行が与えられることを好みます。(:はぁ:初心者)

4

3 に答える 3

0

正しい方法は次のとおりです。

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

ユーザー入力をフィルタリングする唯一の方法は、ホワイトリストを使用することです。特にユニコードでは、ユーザーの頭に浮かぶ可能性のあるすべての文字を推測することはできないため、ブラックリストは機能しません。したがって、安全を確保したい場合は、許可されている文字のリストを使用してください。

于 2013-09-12T19:10:04.837 に答える