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

时间:2008-09-18 02:56:28

标签: bash shell user-input sanitization

我正在寻找一种简单输入的最佳方式:

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

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

订单有关系吗? tr是最佳/唯一的解决方法吗?

6 个答案:

答案 0 :(得分:43)

正如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`

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

答案 1 :(得分:32)

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

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

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

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

答案 2 :(得分:2)

对于重击> = 4.0

CLEAN="${STRING//_/}" && \
CLEAN="${CLEAN// /_}" && \
CLEAN="${CLEAN//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"

这对于使用docker / podman以编程方式创建容器名称特别有用。但是,在这种情况下,您还需要删除下划线:

# Sanitize $STRING for a container name
CLEAN="${STRING//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"

答案 3 :(得分:1)

又快又脏:

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

答案 4 :(得分:1)

你可以通过perl运行它。

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

我在这里使用ksh样式的子shell,我不完全确定它在bash中有效。

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

答案 5 :(得分:0)

看了一下之后,似乎tr确实是最简单的方法:

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

Occam's razor