我想写一个bash函数,检查文件是否具有某些属性并返回true或false。然后我可以在我的脚本中的“如果”中使用它。但是我应该返回什么呢?
function myfun(){ ... return 0; else return 1; fi;}
然后我这样使用它:
if myfun filename.txt; then ...
当然这行不通。如何才能做到这一点呢?
我想写一个bash函数,检查文件是否具有某些属性并返回true或false。然后我可以在我的脚本中的“如果”中使用它。但是我应该返回什么呢?
function myfun(){ ... return 0; else return 1; fi;}
然后我这样使用它:
if myfun filename.txt; then ...
当然这行不通。如何才能做到这一点呢?
当前回答
我发现测试函数输出的最短形式是简单的
do_something() {
[[ -e $1 ]] # e.g. test file exists
}
do_something "myfile.txt" || { echo "File doesn't exist!"; exit 1; }
其他回答
在只使用选项-d检查目录时要小心! 如果变量$1为空,检查仍然会成功。当然,还要检查变量是否为空。
#! /bin/bash
is_directory(){
if [[ -d $1 ]] && [[ -n $1 ]] ; then
return 0
else
return 1
fi
}
#Test
if is_directory $1 ; then
echo "Directory exist"
else
echo "Directory does not exist!"
fi
继@Bruno Bronosky和@mrteatime之后,我建议你只写布尔返回“向后”。我的意思是:
foo()
{
if [ "$1" == "bar" ]; then
true; return
else
false; return
fi;
}
这样就消除了每个return语句都需要两行代码的丑陋要求。
我发现测试函数输出的最短形式是简单的
do_something() {
[[ -e $1 ]] # e.g. test file exists
}
do_something "myfile.txt" || { echo "File doesn't exist!"; exit 1; }
下面是一些测试用例的好例子。
对于基本函数,在方法的最后一行调用true/false,或者使用true;返回以提前退出。
function is_true() { true; }
if is_true; then echo 'true is true'; fi
if ! is_true; then exit; else echo '! true is ! true'; fi
function is_false() { false; }
if ! is_false; then echo 'false is false'; fi
if is_false; then exit; else echo '! false is ! false'; fi
如果不能立即返回,则将返回值存储在变量中。使用(正确;在设置变量时Echo $?)这也适用于嵌套函数(见下一节)。
function from_var() {
local input=$1
local my_var
if ((input == 1)); then
my_var=$(true; echo $?)
else
my_var=$(false; echo $?)
fi
echo 'ignore this line'
(exit $my_var)
}
if from_var 1; then echo "return true is true"; else exit; fi
if from_var 0; then exit; else echo "return false is false"; fi
如果需要存储返回bool类型的函数调用的结果,可以使用相同的技术,但是将调用的输出通过管道传输到/dev/null,或者结果也可能包含来自echo或其他命令的字符串。注意if语句中的(exit $rval)可以让您正确地解释返回值。(其他方法如if (($rval))或if [$rval]将不能正常工作。
# Return a truthy result
rval=$(from_var 1 >/dev/null; echo $?)
if (exit $rval); then echo "return true as variable is true"; else exit; fi
# Return a falsy result
rval=$(from_var 0 >/dev/null; echo $?)
if (exit $rval); then exit; else echo "return false as variable is false"; fi
这段代码的完整输出是:
true is true
! true is ! true
false is false
! false is ! false
ignore this line
return true is true
ignore this line
return false is false
return true as variable is true
return false as variable is false
如果不希望使用> /dev/null抑制函数内的输出,则重写以首先调用该函数。
from_var 0; rval="$?"
myfun(){
[ -d "$1" ]
}
if myfun "path"; then
echo yes
fi
# or
myfun "path" && echo yes