Bash:if语句中的返回代码导致意外行为

Bash:if语句中的返回代码导致意外行为,bash,cmp,Bash,Cmp,我正在使用cmp命令检查两个文件是否相同。我想将命令插入一行if语句中,但它没有按预期工作。当比较两个文件而其中一个文件不存在时,cmp返回2。由于2是非零的,我希望if语句的计算结果为true,但事实并非如此,我也不明白为什么 我想写一些像: if cmp -s tickets.txt tickets_orig.txt; then #do stuff here fi 因为我觉得它短,甜,更直观。这可能吗 我可以使用$?创建一个变通方法,但我不明白为什么当命令返回2时,下面的代码将计算为t

我正在使用
cmp
命令检查两个文件是否相同。我想将命令插入一行if语句中,但它没有按预期工作。当比较两个文件而其中一个文件不存在时,
cmp
返回2。由于2是非零的,我希望if语句的计算结果为true,但事实并非如此,我也不明白为什么

我想写一些像:

if cmp -s tickets.txt tickets_orig.txt; then
  #do stuff here
fi
因为我觉得它短,甜,更直观。这可能吗

我可以使用
$?
创建一个变通方法,但我不明白为什么当命令返回2时,下面的代码将计算为true,上面的代码将计算为false:

cmp -s tickets.txt tickets_orig.txt
if [ $? -ne 0 ]; then
  #do stuff here
fi
退出状态($?)=0表示shell逻辑成功,它允许为异常状态定义不同的错误代码1到127

if command; then #...
相当于

command;
if [ $? -eq 0 ]; then #...
if ! command; then #...

相当于

command;
if [ $? -eq 0 ]; then #...
if ! command; then #...
退出状态($?)=0表示shell逻辑成功,它允许为异常状态定义不同的错误代码1到127

if command; then #...
相当于

command;
if [ $? -eq 0 ]; then #...
if ! command; then #...

相当于

command;
if [ $? -eq 0 ]; then #...
if ! command; then #...

“由于2不是零,我希望if语句的计算结果为true”-
0
表示Bash成功。只有当文件相同时,才会执行
if
块。反转条件:
if!cmp-s tickets.txt tickets\u orig.txt;然后…
“由于2不是零,我希望if语句的计算结果为true”-0表示Bash成功。只有当文件相同时,才会执行
if
块。反转条件:
if!cmp-s tickets.txt tickets\u orig.txt;然后…