我正在编写一个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")
    
  • 09-26 14:33