我读了一个摘自指令的例子,
并打算在\
^[-[:alnum:]\._]+$
# is input a valid filename?
read -p "Enter a single item > "
if [[ "$REPLY" =~ ^[-[:alnum:]\._]+$ ]]; then
echo "'$REPLY' is a valid filename."
else
echo "The string '$REPLY' is not a valid filename."
fi
通过提供一些组合来检查括号表达式。
$ bash read_validate.sh
Enter a single item > test.tst.
'test.tst.' is a valid filename.'
#test `\`
$ bash read_validate.sh
Enter a single item > test\\tst
The string 'test\tst' is not a valid filename.
当我从\
移除转义^[-[:alnum:]\._]+$
时,转为^[-[:alnum:]._]+$
$ bash read_validate.sh
Enter a single item > test.tst
'test.tst' is a valid filename.
# to assert that dot is not the any character sign.
$ bash read_validate.sh
Enter a single item > test*tst
The string 'test*tst' is not a valid filename.
# codes run properly.
似乎没有必要将escape \
插入模式。
是吗?
我无法确定是否省略了关于括号表达式和转义字符的一些关键点?
答案 0 :(得分:2)
Bash使用Extended Regular Expressions。引用标准:
特殊字符'。',' *',' ['和' \' (句点,星号,左括号和反斜杠)将在括号表达式中失去其特殊含义。
因此,在[ ]
内,他们不需要被转义。
由于Bash处理字符串中的反斜杠,因此情况稍微复杂一些:
$ set -x
$ [[ '\' =~ [\.] ]] && echo yes
+ [[ \ =~ [.] ]] # look, no backslash!
因此,使用正则表达式的推荐方法是设置shell变量:
$ re='[\.]'
+ re='[\.]'
$ [[ '\' =~ $re ]] && echo yes
+ [[ \ =~ [\.] ]] # backslash preserved!
+ echo yes
yes