因此,我有一个脚本,用于将文件从一个目录移动到另一个目录。我想检查移动是否成功,所以使用以下代码块:
...
mv "${!i}" "$dirname" 2>/dev/null
echo $? # Check MV exit code
if (( $?==1 ))
then
...
问题是,无论移动是否成功,then
都不起作用。如果我改为这样做
if (( $?==0 ))
它在任何情况下都可以工作。我已经读过,可能是因为$?
被当作一个字符串对待,并且字符串具有0
的值。但是,如果我将其更改为此
if (( $?=="1" ))
它也不起作用。我尝试使用[[ ... ]]
和[ ... ]
代替(( ... ))
,并使用-eq
代替==
,删除和添加空格,添加和删除引号,但没有任何效果
我在做什么错?也许还有另一种方式来响应某些退出代码?
答案 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涵盖了这一点。