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