算术比较在Bash中不起作用

时间:2018-10-05 21:43:01

标签: bash

因此,我有一个脚本,用于将文件从一个目录移动到另一个目录。我想检查移动是否成功,所以使用以下代码块:

...
mv "${!i}" "$dirname" 2>/dev/null
echo $?    # Check MV exit code
if (( $?==1 ))
then
...

问题是,无论移动是否成功,then都不起作用。如果我改为这样做

if (( $?==0 ))

它在任何情况下都可以工作。我已经读过,可能是因为$?被当作一个字符串对待,并且字符串具有0的值。但是,如果我将其更改为此

if (( $?=="1" ))

它也不起作用。我尝试使用[[ ... ]][ ... ]代替(( ... )),并使用-eq代替==,删除和添加空格,添加和删除引号,但没有任何效果

我在做什么错?也许还有另一种方式来响应某些退出代码?

2 个答案:

答案 0 :(得分:6)

问题在这里:

echo $?
if (( $?==1 ))

第一个echo $?将回显mv命令的返回值;但是,在if语句中,再次使用$?将为您提供echo命令的返回值! $?始终是 last 命令的返回值。最后一个命令是echo,它总是成功执行,因此,在该if语句中,您总是得到0的返回值。

您应该做的是将值保存到变量中,然后将其与该变量进行比较:

mv "${!i}" "$dirname" 2>/dev/null
ret_val=$?
echo ${ret_val}
if (( ${ret_val}==1 ))

答案 1 :(得分:3)

您可以直接检查命令的退出状态:

if mv "${!i}" "$dirname" 2>/dev/null; then
    # Code for successful move
else
    # Code for unsuccessful move
fi

或者,为了减少幸福的道路的缩进量:

if ! mv "${!i}" "$dirname" 2>/dev/null; then
    # Code for unsuccessful move
    return 1 # Or maybe exit 1 if in a script, not a function
fi
# Code for successful move

关于echo的退出状态如何弄乱您的代码,Tyler's answer涵盖了这一点。