如何在 bash 脚本中创建“if cond success failure”函数

如何在 bash 脚本中创建“if cond success failure”函数

我正在接近这个:

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;根据您的喜好进行调整。

相关内容