私はこれに近づいています:
myif() {
if ([ $1 ]) then
shift
$*
true
else
shift
shift
$*
false
fi
}
主な部分がif ([ $1 ]) then
間違っています。私は次の3つのことができるようにしたいです。
# 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
。 1つの方法は次のとおりです。
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
}
ここでは、動作を示すために、任意のバージョンの成功ハンドラ、失敗ハンドラ、およびチェック条件を作成しました。
以下はいくつかの実行例です。
$ 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