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:]'`"

我想是奥卡姆的剃刀。


推荐阅读

    linux命令删除用户组?

    linux命令删除用户组?,管理,密码,系统,用户组,用户,概念,命令,文件,管理员,

    linux中用户创建命令?

    linux中用户创建命令?,密码,系统,用户,软件,命令,联系方式,管理,信息,用户

    输入linux命令行参数?

    输入linux命令行参数?,工作,系统,地址,数据,流程,电脑,信息,命令,工具,管理,l

    linux运行脚本命令?

    linux运行脚本命令?,系统,代码,服务,文件,工具,平台,网站,脚本,命令,方法,Lin

    linux注销命令用户?

    linux注销命令用户?,系统,服务,密码,地址,工作,命令,状态,工具,信息,基础,lin

    linux命令行创建用户?

    linux命令行创建用户?,系统,密码,软件,新增,用户,联系方式,管理,用户名,命

    linux系统用户命令?

    linux系统用户命令?,系统,工作,地址,信息,管理,命令,目录,时间,电脑,名称,请

    linux脚本命令修改?

    linux脚本命令修改?,密码,系统,文件,资料,工具,软件,基础,地址,标准,命令,lin

    linux脚本命令教学?

    linux脚本命令教学?,标准,数据,系统,脚本,代码,流程,官网,底部,命令,变量,lin

    linux命令中文输入?

    linux命令中文输入?,系统,单位,软件,管理,权威,音乐,命令,模式,录像带,短片,l

    linux命令所有用户?

    linux命令所有用户?,系统,密码,信息,情况,名称,命令,用户,时间,地址,位置,如

    linux命令进入用户?

    linux命令进入用户?,系统,密码,用户,地址,信息,软件,命令,用户名,联系方式,

    linux命令注释脚本?

    linux命令注释脚本?,代码,工具,名称,工作,脚本,发行,服务,环境,数据,基础,lin

    linux命令用户管理?

    linux命令用户管理?,系统,密码,管理,工作,信息,地址,工具,命令,用户,基础,LIn

    linux用户与组的命令?

    linux用户与组的命令?,管理,系统,名称,用户组,密码,用户,命令,情况,信息,单

    linux输入命令星号?

    linux输入命令星号?,密码,网络,系统,通讯,概念,情况,数据,术语,网关,表示,如

    脚本linux上运行命令?

    脚本linux上运行命令?,工具,代码,时间,密码,系统,环境,名字,位置,第三,下来,t

    linux添加用户的命令?

    linux添加用户的命令?,密码,系统,软件,联系方式,用户,新增,信息,管理人员,

    linux命令界面输入法?

    linux命令界面输入法?,系统,工具,信息,第三,软件,输入法,名字,盘后,语言,区