Bashスクリプトで「条件成功失敗」機能を作成する方法

Bashスクリプトで「条件成功失敗」機能を作成する方法

私はこれに近づいています:

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

おすすめ記事