我正在接近这个:
myif() {
if ([ $1 ]) then
shift
$*
true
else
shift
shift
$*
false
fi
}
主要部分是if ([ $1 ]) then
不正确的。我希望能够做这三件事:
# boolean literals, probably passed in as the output to variables.
myif true successhandler failurehandler
myif false successhandler failurehandler
# a function to be evaluated
myif checkcondition successhandler failurehandler
checkcondition() {
true
# or:
# false, to test
}
检查文件的方法如下:
file_exists() {
if ([ -e $1 ]) then
shift
$*
true
else
shift
shift
$*
false
fi
}
想知道如何让第一个示例在处理这 3 种情况的情况下工作。我也尝试过使用eval
和执行此操作:
myif() {
if ([ "$*" ]) then
shift
$*
true
else
shift
shift
$*
false
fi
}
但不行。
答案1
看起来你想执行$1
,并根据其成功或失败,执行$2
或$3
。这是一种方法:
successhandler() {
echo GREAT SUCCESS
}
failurehandler() {
echo sad failure
}
checkcondition() {
if (( RANDOM < 15000 ))
then
true
else
false
fi
}
myif() {
# disable filename generation (in case globs are present)
set -f
if $1 > /dev/null 2>&1
then
$2
true
else
$3
false
fi
}
在这里,我创建了 successhandler、failurehandler 和 checkcondition 的任意版本来演示该行为。
以下是一些示例运行:
$ myif true successhandler failurehandler
GREAT SUCCESS
$ myif false successhandler failurehandler
sad failure
$ myif 'test -f /etc/hosts' successhandler failurehandler
GREAT SUCCESS
$ myif 'test -f /etc/hosts/not/there' successhandler failurehandler
sad failure
$ myif checkcondition successhandler failurehandler
GREAT SUCCESS
$ myif checkcondition successhandler failurehandler
sad failure
$ myif checkcondition successhandler failurehandler
GREAT SUCCESS
$ myif checkcondition successhandler failurehandler
sad failure
$ myif checkcondition successhandler failurehandler
sad failure
在内部myif()
,我专门将 stdout 和 stderr 删除到/dev/null
;根据您的喜好进行调整。