我有以下代码:
if ! [[ $1 =~ ^[0-9a-zA-Z._-]+$ ]]; then
echo "argument contains characters not valid for name file"
fi
我要验证的是字符串是否包含有效文件名的有效字符(我知道我应该添加对文件开头和结尾处长度的测试)。
问题:
因此,它不会验证其中带有空格的字符串。
因此我需要在正则表达式中包含空格,但以下任何一项均无效:
[[ $1 =~ ^[0-9a-zA-Z ._-]+$ ]] >> syntax error
[[ $1 =~ ^[0-9a-zA-Z\t._-]+$ ]] >> still do not pass spaces
[[ $1 =~ ^[0-9a-zA-Z\s._-]+$ ]] >> still do not pass spaces
[[ $1 =~ "^[0-9a-zA-Z ._-]+$" ]] >> syntax error
我不确定还可以尝试什么。
到目前为止,我想到了一件快速而肮脏的事情:
myNewVar="${1// /}"
并以此进行测试,但这远非优雅……
答案 0 :(得分:1)
您可以使用[:blank:]
character class:
re='^[[:alnum:][:blank:]._-]+$'
if ! [[ $1 =~ $re ]]; then
请注意,我已将正则表达式移到单独的变量 1 中,并引入了[:alnum:]
字符类。
您可以使用参数扩展代替正则表达式来删除允许的字符并查看是否剩余任何内容:
if [[ -n ${1//[[:alnum:][:blank:]._-]} ]]; then
echo "illegal character found"
fi
1 主要是出于可移植性的考虑,但也要避免引用意外(例如上一个示例中未引用的空白),请参阅BashGuide(“正则表达式”部分)。