检查是否缺少特定参数 - 顺序并不重要

时间:2018-06-11 14:12:34

标签: bash

在bash脚本中检查缺少特定参数的最简单(也可能是单行)的方法是什么,忽略参数顺序?

我想在脚本的开头分配一个名为REAL_RUN的“boolean”变量truefalse,基于参数的缺席或存在{{1}包含在所有脚本参数中。像这样:

--dry-run

我希望REAL_RUN=... # <-- what to put here ? if [ "$REAL_RUN" = true ] ; then # do something fi 可以为REAL_RUN分配以下情况:

true

相反,必须将以下示例./run.sh ./run.sh foo bar ./run.sh foo --dry-run-with-unexpected-suffix bar ./run.sh foo ------dry-run bar 设置为REAL_RUN

false

3 个答案:

答案 0 :(得分:1)

case可移植到POSIX sh。它可以是一个单行,虽然传统上,该语句分为多个物理行。

case " $@ " in *\ --dry-run\ *) REAL_RUN=false;; *) REAL_RUN=true;; esac

或易读性

# Put spaces around "$@" to make the later logic simpler
case " $@ " in
  # If --dry run exists with spaces on both sides,
  *\ --dry-run\ *)
    # Set REAL_RUN to false
    REAL_RUN=false;;
  # Otherwise,
  *)
    # ... it's true.
    REAL_RUN=true;;
esac

有些人喜欢将特殊标记;;放在自己的一行上,但在这样的简单case中,这似乎过分了。

这有点不精确,因为它无法区分参数和引用空格之间的空格。有人可以写command " --dry-run "并且它会触发条件,即使严格来说,这应该被解释为静态字符串参数,它以文字空间开始和结束,而不是一个选项。 (为了防止这种情况,可能会循环遍历"$@"并检查文字参数:

REAL_RUN=true
for arg; do    # shorthand for 'for arg in "$@"; do'
    case $arg in
      --dry-run) REAL_RUN=false;;
    esac
done

但这绝对不是单行。)

答案 1 :(得分:0)

您可以在BASH中使用此正则表达式匹配:

[[ $# -eq 0 || ! $* =~ (^| )--dry-run( |$) ]] &&
REAL_RUN=true || REAL_RUN=false;

echo "REAL_RUN=$REAL_RUN"

答案 2 :(得分:-1)

您可以创建一个类似的函数:

contains () {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0 ; done
  return 1
}

然后通过传递已经来自系统的数组来使用它:

[[ `contains "apple" "$@"` -eq 0 ]] && echo "Is present" || echo "Is not present"

问候!