read -e STRING并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。顺序重要吗? tr是解决此" /> read -e STRING并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。顺序重要吗? tr是解决此" /> read -e STRING并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。顺序重要吗? tr是解决此" />
当前位置:首页> 正文

关于shell:在bash脚本中,如何清理用户输入?

关于shell:在bash脚本中,如何清理用户输入?

In a bash script, how do I sanitize user input?

我正在寻找进行简单输入的最佳方法:

1
2
echo -n"Enter a string here:"
read -e STRING

并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。

顺序重要吗? tr是解决此问题的最佳/唯一方法吗?


正如dj_segfault指出的那样,shell可以为您完成大部分操作。看起来,您将不得不依靠外部的东西来降低字符串的大小写。为此,您有很多选择,例如上面的perl单行代码等,但是我认为tr可能是最简单的。

1
2
3
4
5
6
7
8
# 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直到结尾,我们知道我们只有字母数字和下划线,并且可以确保没有空格,因此我们不必担心shell会解释特殊字符。


Bash可以自己完成所有操作,非常感谢。如果查看参数扩展手册页中的部分,您会看到bash具有内置的替换,子字符串,修剪,rtrim等。

要消除所有非字母数字字符,请执行

1
CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

那是奥卡姆的剃刀。无需启动另一个进程。


您可以通过perl运行它。

1
export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

我在这里使用的是ksh样式的subshel??l,我不太确定它是否可以在bash中工作。

关于shell的好处是,您可以使用perl,awk,sed,grep...。


快速又肮脏:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`


经过一番环顾,看来tr确实是最简单的方法:

1
export CLEANSTRING="`echo -n"${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

我想是奥卡姆的剃刀。


展开全文阅读

相关内容