我正在编写一个 shell 脚本来检查参数是否与字符串匹配。其中大约有 20 个,将来可能需要添加更多。
目前我写的方式很难阅读并且更新起来也很麻烦。我对 shell 脚本编写不太熟悉,所以我不确定简化此操作并使其更易于管理的最佳方法。
if [ $4 =="CRITICAL" ] && [[ $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || ]]
VARIABLE=1
fi
在上面的脚本中,Foo 和 bar 都是不同的字符串。
答案1
在标准 shell 中,您可以使用case
,它支持交替:
#!/bin/sh
if [ "$4" = CRITICAL ]; then
case $2 in
foo|bar|doo|quux)
VARIABLE=1
;;
esac
fi
如果在上面写五行case
太冗长,就写在一行上:
case $2 in foo|bar|doo|quux) VARIABLE=1;; esac
请注意,这==
不是 中的标准[ .. ]
,但 Bash 和 ksh 中支持它。
答案2
if [[ $4 == CRITICAL && $2 =~ ^(a|b|c|d|e|f|g)$ ]]; then
VARIABLE=1
fi
顺便说一句,不带引号的变量和位置参数在 内部使用是安全的[[ ... ]]
,但在[ ... ]
.换句话说,你[ $4 == "CRITICAL" ]
应该是[ "$4" == "CRITICAL" ]
。
另外,CRITICAL
上面根本不需要引用。它是一个固定字符串,没有空格或 shell 元字符。如果它是一个固定字符串,由于任何原因确实需要引号,那么最好使用单引号。
单引号用于固定字符串,双引号用于当您想要将变量、命令替换等插入字符串时。
答案3
也许使用case
与函数结合的语句?
function a_func){ ... }
function b_func(){ ... }
case "${1}" in
"${4}" == "CRITICAL" && $(echo "${2}" | egrep -n 'a|b|c|d|e|f|g') -gt 0))
a_func ;;
*)
b_func ;;
esac
虽然是伪代码,但它应该引导方向