bash スクリプトでユーザー入力をサニタイズするにはどうすればよいですか?
-
01-07-2019 - |
質問
単純な入力を取得する最良の方法を探しています。
echo -n "Enter a string here: "
read -e STRING
英数字以外の文字、小文字 (大文字) を削除し、スペースをアンダースコアに置き換えてクリーンアップします。
順序は重要ですか?は tr
これに対処する最善の/唯一の方法は何ですか?
解決
dj_segfault が指摘しているように、シェルはこれのほとんどを実行できます。ただし、文字列を小文字にするには、外部のものに頼る必要があるようです。これには、上記の Perl ワンライナーなど、多くのオプションがありますが、おそらく tr が最も簡単だと思います。
# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`
ここでの順序は多少重要です。アンダースコアを削除し、さらにスペースをアンダースコアに置き換えたいので、最初に必ずアンダースコアを削除する必要があります。最後まで tr に渡すのを待つことで、英数字とアンダースコアのみが存在し、スペースが含まれていないことを確認できるため、シェルによって特殊文字が解釈されることを心配する必要がなくなります。
他のヒント
Bash はこれをすべて単独で行うことができます。ありがとうございます。manページのセクションを見ると、 パラメータの拡張, を見ると、その bash には組み込みの置換、部分文字列、トリム、rtrim などが含まれていることがわかります。
英数字以外の文字をすべて削除するには、次のようにします。
CLEANSTRING=${STRING//[^a-zA-Z0-9]/}
それは オッカムのかみそり。別のプロセスを起動する必要はありません。
手早く汚い:
STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`
Perl を介して実行することもできます。
export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')
ここでは ksh スタイルのサブシェルを使用していますが、それが bash で動作するかどうかは完全にはわかりません。
シェルの良いところは、perl、awk、sed、grep を使用できることです。
少し周りを見回してみると、どうやら tr
確かに最も簡単な方法です:
export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-' | tr '[:upper:]' '[:lower:]'`"
オッカムのかみそり, 、 たぶん。