在bash脚本中,如何清理用户输入?

Dev*_*ams 43 bash shell sanitization user-input

我正在寻找一个简单输入的最佳方法:

echo -n "Enter a string here: "
read -e STRING
Run Code Online (Sandbox Code Playgroud)

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

订单有关系吗?这tr是最好/唯一的方法吗?

Tho*_*mee 44

正如dj_segfault指出的那样,shell可以为你完成大部分工作.看起来你不得不依靠外部的东西来降低弦线的外壳.为此你有很多选择,比如上面的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`
Run Code Online (Sandbox Code Playgroud)

这里的顺序有点重要.我们希望摆脱下划线,再加上带下划线的空格,所以我们必须先确保剥离下划线.通过等待将事物传递到tr直到结束,我们知道我们只有字母数字和下划线,我们可以确定我们没有空格,因此我们不必担心shell会解释特殊字符.

  • 读者注意事项:如果您在执行此操作时遇到困难,请检查您的 shebang 以查看您是否正在调用 bash 或 sh,以及您的系统如何解释“sh”。 (2认同)
  • 从Bash 4开始,它也可以进行大小写修改.`lowercase = $ {CLEAN ,,}`[Bash Hackers Wiki](http://wiki.bash-hackers.org/syntax/pe)以比人工页面更人性化的方式解释参数扩展. (2认同)

dj_*_*ult 34

Bash可以自己完成这一切,非常感谢你.如果你查看参数扩展的手册页的部分,你会看到bash有内置替换,substring,trim,rtrim等.

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

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}
Run Code Online (Sandbox Code Playgroud)

那是奥卡姆的剃刀.无需启动其他流程.

  • 对于规范的子集,它是一个很好的答案,但它不会将空格更改为下划线. (2认同)