在bash脚本中检查缺少特定参数的最简单(也可能是单行)的方法是什么,忽略参数顺序?
我想在脚本的开头分配一个名为REAL_RUN
的“boolean”变量true
或false
,基于参数的缺席或存在{{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
答案 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"
问候!