有人可以帮我找出我在这个bash脚本上做错了什么。我试图在case语句中使用if语句,而bash抱怨语法错误。
findinfo() {
OPT1=$1
case "$OPT1" in
linux)
echo "Setting environment"
ESC="hello_linux" if [[ "$PROJN" == "ONE" || "$PROJN" == "two" ]]
;;
Windows)
echo "Setting environment"
ESC="hello_windows" if [[ "$PROJN" == "ONE" || "$PROJN" == "two" ]]
;;
Android)
echo "Setting environment"
ESC="hello_android" if [[ "$PROJN" == "ONE" || "$PROJN" == "two" ]]
;;
esac
}
由于
答案 0 :(得分:10)
在bash中,if
必须位于then
部分之前:
if [[ "$PROJN" == "ONE" || "$PROJN" == "two" ]] ; then ESC=hello_linux ; fi
在Perl中可以使用“postfix”if
(也可能在其他地方),但不能在bash中使用。
答案 1 :(得分:6)
以下语法是替代方案:
[[ $PROJN = ONE || $PROJN = TWO ]] && ESC=hello_linux
...以下内容仍然较短,并且符合较旧的shell:
case $PROJN in ONE|TWO) ESC=hello_linux ;; esac
答案 2 :(得分:1)
在case语句中使用if
没有问题。这是你的if
陈述有点不正确。
您的if
声明与$ESC
作业位于同一行。在case
之外不起作用在内部不起作用。此外,您需要在-o
语句中使用if
作为或,如果if
语句为真,则至少需要执行一行。 (我只是将echo
作为占位符)。
可能是这个特定的if
语句应该在您的case
之外。我注意到它们都是一样的。在这种情况下无需重复代码,只需将if
放在esac
之后。
顺便说一下:你可以用以下两种方式之一在if内部做or
:
if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
或
if [[ "$PROJN" == "ONE" ]] || [[ "$PROJN" == "two" ]]
现在回到你的定期计划......
findinfo() {
OPT1=$1
case "$OPT1" in
linux)
echo "Setting environment"
ESC="hello_linux"
if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
then
echo "Here be dragons..."
fi
;;
Windows)
echo "Setting environment"
ESC="hello_windows"
if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
then
echo "Here be dragons..."
fi
;;
Android)
echo "Setting environment"
ESC="hello_android"
if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
then
echo "Here be dragons..."
fi
;;
esac
}