Bash中如何在条件判断中使用函数返回值?
Bash脚本函数返回值判断的正确写法
问题背景
我正尝试编写一个简单的Bash脚本,用于从云端获取第三方软件,并通过CMake的execute_process()调用该脚本。脚本包含三个函数:verifyObject()、getFile()、clean()。其中verifyObject()的实现如下:
verifyObject() { if [ -e "${TP_LIB_PATH}/${TP_LIB_SO}" ]; then return 1 else return 0 fi }
该函数功能正常,但我无法在其他函数的条件判断中正确使用它的返回值。我想要实现类似如下C/C++伪代码的逻辑:
if(!verifyObject()) { // 文件不存在时执行此分支 } else { // 文件存在时执行此分支 }
我尝试的写法无法正确执行逻辑:
clean() { if [ verifyObject -eq 1 ]; then // 即使返回值为1也不会执行此分支 else // 始终执行此分支 fi }
错误原因
你之前的写法错误在于:[ verifyObject -eq 1 ]是将字符串verifyObject和数字1进行比较,而不是调用verifyObject函数并获取它的返回值,因此这个条件永远不成立,会始终进入else分支。
正确实现方式
方式一:直接在if中调用函数并取反
Bash中if语句会判断命令的退出状态码(0表示成功,非0表示失败),可以直接调用函数,并通过!取反来实现你要的逻辑:
clean() { if ! verifyObject; then # 对应verifyObject返回0的情况(文件不存在),执行此分支 echo "文件不存在,执行对应操作" else # 对应verifyObject返回1的情况(文件存在),执行此分支 echo "文件存在,执行对应操作" fi }
方式二:先获取返回值再判断
先调用函数,通过$?获取返回值,再进行条件判断:
clean() { verifyObject local ret_code=$? if [ $ret_code -eq 0 ]; then # 文件不存在时执行 echo "文件不存在" else # 文件存在时执行 echo "文件存在" fi }
更符合Bash惯例的优化建议
Bash的退出码惯例是0表示成功,非0表示失败,建议调整verifyObject()的返回逻辑,让它更符合这个惯例,这样代码逻辑会更直观:
verifyObject() { if [ -e "${TP_LIB_PATH}/${TP_LIB_SO}" ]; then return 0 # 文件存在,返回成功状态码 else return 1 # 文件不存在,返回失败状态码 fi }
此时clean()的判断逻辑可以简化为:
clean() { if verifyObject; then # 文件存在时执行 echo "文件存在,执行清理操作" else # 文件不存在时执行 echo "文件不存在,无需清理" fi }
内容的提问来源于stack exchange,提问作者mreff555
相关产品推荐
相关产品推荐

