我正在编写一个清理用户输入的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
答案 0 :(得分:5)
\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")
答案 1 :(得分:2)
编辑以匹配问题。
function validateEntry {
echo ${1//[^[:alnum:][:space:]]/}
}
if [[ $# -eq 3 ]]; then
echo $(validateEntry "$1")
echo $(validateEntry "$2")
echo $(validateEntry "$3")
fi
命令
./test.sh arg1 arg2 "this is arg3"
输出:
arg1
arg2
this is arg3