我正在编写一个bash验证功能,以清理用户输入。
这个想法是,如果脚本具有3个参数,则这些参数只能是字母数字值。但是一个参数可以是多个单词,并用双引号引起来,如下所示:myfunction arg1 arg2 "this is arg3"
因此,我基本上希望将所有不是字母数字或空格字符的内容都剥离掉。
此刻,我有:validateEntry() { string=$1 clean=${string//[^a-zA-Z0-9\s]/}}
但这似乎行不通。在myfunction arg1 arg2 "this is arg3"
中,is arg3
被剥离。
我使用此功能的方式是在脚本中,如下所示:
name=$(validateEntry $1)
我需要帮助。
编辑:
这个想法是在脚本中使用
validateEntry
函数,该脚本可以采用3个参数,如下所示:if [[ "$#" -eq 3 ]]; then
arg1=$(validateEntry $1)
arg2=$(validateEntry $2)
arg3=$(validateEntry $3)
echo "${arg1}, ${arg2}, ${arg3}."
fi
但是,如果我脚本的第三个参数是
this is arg3
,则$arg3
简化为this
,即使当我使用相同的三个参数直接调用函数时,第三个arg也是this is arg3
最佳答案
\s
在模式(不是正则表达式)中并不表示“任何类型的空格”。而是只使用文字空间
clean=${1//[^a-zA-Z0-9 ]}
或者,如果要匹配空格,制表符,换行符等,请使用POSIX字符类
[:space:]
:clean=${1//[^a-zA-Z0-9[:space:]]}
(为此,您也可以将字符类用于字母和数字:
clean=${1//[^[:alnum:][:space:]]}
)
完成此操作后,还需要更改其他两件事:
validateEntry () {
echo "${1//[^[a[:alnum:][:space:]]}"
}
name=$(validateEntry "$1")