如果我通过以下方式传递一个词作为参数:
$./file.sh hello
当它应该打印“Argument应该是一个数字”时,它给出了Even作为输出
#!/bin/bash
set -e
if [[ -z $1 ]]
then
echo "Argument expected"
else
if [[ $1 =~ "\D" ]] #This does not work as expected
then
echo "Argument should be a number"
else
a=$1%2
if [[ a -eq 0 ]]
then
echo "Even"
elif [[ a -eq 1 ]]
then
echo "Odd"
fi
fi
fi
#End of program
当我在if语句中将“\ D”更改为“[^ 0-9]”时,它按预期工作并向控制台输出“Argument should a number”。 他们俩都没有相同的含义吗?如果不是,那两者有什么不同?
答案 0 :(得分:3)
Bash使用POSIX扩展正则表达式,而不是PCRE。它使用Bracket Expressions而不是像\D
这样的转义序列。数字的括号表达式为
[:digit:]
并匹配非数字,您可以在带有否定运算符的字符类中使用它:
[^[:digit:]]
正如您所看到的,这比写[^0-9]
要长,所以它不是一个简写。它对于其他语言环境的可移植性很有用,因为它也包括它们的数字。
答案 1 :(得分:0)
Bash正则表达式根本不支持PCRE正则表达式语法。
您可能想要了解不同的正则表达方言及其历史。
参见例如Why are there so many different regular expression dialects?
答案 2 :(得分:0)
相当于\D
的POSIX是[^[:digit:]]
。