基于环境变量的条件分配


11

在bash脚本中,我要分配一个局部变量,以便该值取决于外部的全局环境变量($MYAPP_ENV)。

if [ "$MYAPP_ENV" == "PROD" ]
then
    SERVER_LOGIN=foobar123@prod.example.com
else
    SERVER_LOGIN=foobar987@test.example.com
fi

有没有一种较短的(到目前为止还很干净)编写上述作业的方法?(大概使用某种条件运算符/内联if。)

Answers:


17

您还可以使用大小写/切入bash来执行此操作:

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="foobar123@prod.example.com" ;;
    *) SERVER_LOGIN="foobar987@test.example.com" ;;
esac

或这种方法:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com

2
case语句比将其全部塞成一行要容易得多(如果第二条命令可能失败,则可能会导致灾难性后果,在这种情况下,这很好,但养成这种习惯可能会付出高昂的代价)。这是处理此类情况的最佳方法。
克里斯·

@Jonik-如果满足您的要求,请接受其中一个答案,以便其他人知道您的问题已解决。谢谢。
slm

我认为案例陈述是所提供选项中最干净的,即使这并非我所要寻找的。哦,好吧,Bash语法很尴尬,无法解决。:)
Jonik

1
@Jonik-这也是我的发现。相信我,我一直在寻找替代方案,我更喜欢宽范围的行而不是长程序,而if / then / else对于我的口味也很冗长。
slm

9

尝试:

[ condition ] && var=value_when_true || var=value_when_false

如果您的分配是数字分配,则可以使用bash三元运算:

(( assign_condition ? value_when_true : value_when_false ))

1
前者不是三元的。true && false || echo "if this was ternary, this wouldn't be executed"
克里斯·

@chris-是的,但是即使术语不太正确,它仍然是一个很好的实用答案。
cas 2013年

@CraigSanders术语很重要-当第二个命令可能失败时,我在脚本中经常看到这种用法。
克里斯·

@ChrisDown:编辑答案,现在更好了吗?
cuonglm '16

1
哈哈,花了2.5年的时间进行cuonglm的编辑!
iruvar

4

您可以使用&&||运算符

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.