我想写一个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 ...
当然这行不通。如何才能做到这一点呢?
当前回答
myfun(){
[ -d "$1" ]
}
if myfun "path"; then
echo yes
fi
# or
myfun "path" && echo yes
其他回答
在返回之前立即使用true或false命令,然后不带参数返回。返回值将自动使用上一个命令的值。
如果不使用1或0,则为return提供参数是不一致的、特定于类型的并且容易出错。正如前面的注释所述,在这里使用1或0不是处理这个函数的正确方法。
#!/bin/bash
function test_for_cat {
if [ "$1" = "cat" ];
then
true
return
else
false
return
fi
}
for i in cat hat;
do
echo "${i}:"
if test_for_cat "${i}";
then
echo "- True"
else
echo "- False"
fi
done
输出:
$ bash bash_return.sh
cat:
- True
hat:
- False
用0表示真,用1表示假。
示例:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
# 0 = true
return 0
else
# 1 = false
return 1
fi
}
if isdirectory $1; then echo "is directory"; else echo "nopes"; fi
Edit
从@amichair的评论来看,这些也是可能的
isdirectory() {
if [ -d "$1" ]
then
true
else
false
fi
}
isdirectory() {
[ -d "$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="$?"
我遇到了一个问题(没有明确提到吗?)也就是说,不是如何返回布尔值,而是如何正确地计算它!
我想说的是如果[myfunc];然后……,但这是完全错误的。你不能使用括号!如果myfunc;然后……就是这样做的。
正如@Bruno和其他人重申的那样,真和假是命令,而不是值!这对于理解shell脚本中的布尔值非常重要。
在这篇文章中,我解释并演示了使用布尔变量:https://stackoverflow.com/a/55174008/3220983。我强烈建议你去核实一下,因为它们是如此密切相关。
在这里,我将提供一些从函数返回和计算布尔值的示例:
这样的:
test(){ false; }
if test; then echo "it is"; fi
不产生回声输出。(即false返回false)
test(){ true; }
if test; then echo "it is"; fi
生产:
it is
(即true返回true)
And
test(){ x=1; }
if test; then echo "it is"; fi
生产:
it is
因为0(即true)是隐式返回的。
现在,这就是把我搞砸的事情……
test(){ true; }
if [ test ]; then echo "it is"; fi
生产:
it is
AND
test(){ false; }
if [ test ]; then echo "it is"; fi
还生产:
it is
在这里使用括号会产生假阳性!(我推断“outer”命令的结果是0。)
从我的帖子中得到的主要信息是:不要像典型的相等检查那样使用括号来计算布尔函数(或变量),例如if [x -eq 1];然后……!
重写一下可能有用 函数myfun(){…返回0;否则返回1;Fi;}作为这个函数myfun(){…返回;其他假;fi;}。也就是说,如果函数中的最后一条指令为false,则整个函数的结果为false,但无论如何都会返回结果为true的中断函数。我相信至少对我的bash解释器来说是这样的。