在linux shell脚本中使用函数时,需要注意函数返回后,返回值的使用,不然很容易出问题。具体来说,shell脚本函数通过return返回后,返回值会保存在$? 中。需要注意的是,$? 会在函数返回后很快变回0值,所以应在函数返回后尽快将$? 保存在变量中,然后后续通过该变量来访问返回值,而不是直接通过$? 来进行后续处理。
如下代码,尽管D2确实是个目录,但是得到的结果始终会是$A 是一个REG文件,这是因为函数testFile返回后做了些其他的事,在后续进行$? 值判断时,它已变回了0.
#! /bin/bash
testFile()
{
if [ -f $1 ]; then
return 0
else
return 1
fi
}
for A in f1 D2
do
testFile $A
RET=something
if [ $? = 0 ]; then
echo '$?' is $?
echo $A is a REG file
else
echo '$?' is $?
echo $A is not a REG file
fi
done
此时脚本执行结果为: 想要让程序按预期执行,需要在函数返回后,立即将返回值赋给变量,如下代码所示:
#! /bin/bash
testFile()
{
if [ -f $1 ]; then
return 0
else
return 1
fi
}
for A in f1 D2
do
testFile $A
RET=$?
if [ $RET = 0 ]; then
echo '$?' is $?
echo $A is a REG file
else
echo '$?' is $?
echo $A is not a REG file
fi
done
执行结果为:
|