速写字符类不在shell脚本中工作

时间:2018-02-06 22:30:01

标签: bash shell

如果我通过以下方式传递一个词作为参数:

$./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”。 他们俩都没有相同的含义吗?如果不是,那两者有什么不同?

3 个答案:

答案 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:]]