Bash 为什么匹配单个0时expr失败

Bash 为什么匹配单个0时expr失败,bash,expr,Bash,Expr,以下命令起作用: $ expr 1 : '\(.\)' || echo fail 1 尝试匹配字符串“0”时,命令失败,例如$?==1: $ expr 0 : '\(.\)' || echo fail fail 手册页上说: 如果表达式既不是null也不是0,则退出状态为0 但是,由于匹配字符串为0而返回退出状态1是没有意义的。expr的退出状态取决于返回的字符串,而不是生成该字符串的操作 由于返回的字符串为0,因此退出状态为1 是否使用成功的正则表达式匹配或其他运算符生成0并不相关 $ e

以下命令起作用:

$ expr 1 : '\(.\)' || echo fail
1
尝试匹配字符串“0”时,命令失败,例如$?==1:

$ expr 0 : '\(.\)' || echo fail
fail
手册页上说:

如果表达式既不是null也不是0,则退出状态为0


但是,由于匹配字符串为0而返回退出状态1是没有意义的。

expr的退出状态取决于返回的字符串,而不是生成该字符串的操作

由于返回的字符串为0,因此退出状态为1

是否使用成功的正则表达式匹配或其他运算符生成0并不相关

$ expr 3 - 3 || echo "fail"
0
fail

expr似乎只是将
0
作为错误案例进行计算:

$ expr 1
$ echo $?
0

$ expr 0
$ echo $?
1

expr
根本不应该在bash代码中使用;它是20世纪70年代的一个工件,根本不是shell的一部分(调用它会启动一个单独的可执行文件,
/usr/bin/expr
)……如果您想使用bash的内置正则表达式代码,
[[1=~(.)]
是另一种选择——它的行为更明智(如果有匹配项,即使其内容是
0
,也会评估为真实)@DagLöwenvald:我不知道你的声明的目的是什么,但是对于所有数字
d
expr$d:'\(.\')
将$d写入标准输出。因此,如果
d=0
,则退出状态为1,对于
d
的其他值,退出状态为0。
$ expr 1
$ echo $?
0

$ expr 0
$ echo $?
1