如果在单行中设置了环境变量,bash将为变量分配一个值

时间:2018-11-27 07:19:55

标签: bash

如何根据环境变量将变量值设置为某些值。

例如,我希望它成为

var1 = var2 if ENV_VARIABLE==true else var3

(为简单起见,使用python语法)

我希望这也可以单行发生。在这种情况下,bash中的正确语法是什么? https://unix.stackexchange.com/questions/122845/using-a-b-for-variable-assignment-in-scripts的指南很好,但没有涵盖这种情况。

5 个答案:

答案 0 :(得分:3)

尝试一下:

[[ "$ENV_VARIABLE" == "true" ]] && var1="$var2" || var1="$var3"        

答案 1 :(得分:3)

这是可移植到ur-sh上的,并且从技术上讲可以放在一行上。

case $ENV_VARIABLE in true) var1=var2;; *) var1=var3;; esac

答案 2 :(得分:3)

var1 = var2 if ENV_VARIABLE==true else var3

所以:

var2=smth
var3="other smth"
ENV_VARIABLE=true

我们可以(最好不要删除结尾的换行符):

if [ "$ENV_VARIABLE" = true ]; then var1=$var2; else var1=$var3; fi

或(假设ENV_VARIABLE仅是字符串“ true”或字符串“ false”):

if "$ENV_VARIABLE"; then var1=$var2; else var1=$var3; fi

或(删除尾随的换行符)

var1=$(if "$ENV_VARIABLE"; then echo "$var2"; else echo "$var3"; fi)

或(删除尾随的换行符)

var1=$("$ENV_VARIABLE" && echo "$var2" || echo "$var3")

或(删除结尾的换行符,而eval是邪恶的)

var1=$(eval echo "\$$("$ENV_VARIABLE" && echo var2 || echo var3)")

或(评估是邪恶的)

eval var1=\$$(arr[0]=var2; arr[1]=var3; [ "$ENV_VARIABLE" = true ]; echo "${arr[$?]}")

或(评估是邪恶的)

eval var1=\$$("$ENV_VARIABLE" && echo var2 || echo var3)

或(删除尾随的换行符)

printf -v var1 "%s" "$("$ENV_VARIABLE" && echo "$var2" || echo "$var3")"

或(疯狂)

var1=$("$ENV_VARIABLE"; printf "%s\x00" "$var2" "$var3" | head -z -n$(($?+1)) | tail -z -n1 | tr -d '\000')

或(命名参考变量,因此不是真正的赋值,而是一个指针)

declare -n var1=$("$ENV_VARIABLE" && echo "var2" || echo "var3")

喘不过气来。老实说,只有第一个才是正确的。有时我在脚本中使用布尔变量作为truefalse字符串,这仅允许删除[ ... = true ]部分。

答案 3 :(得分:3)

if语句可以写在一行上。

-z可用于测试变量是否已定义并具有值。

{-a”在测试中代表AND

==编辑==

(请参阅@tripleee的评论:第一个版本包含一个-a,这是不可靠的。我没有发现所建议的第一个版本有问题,但是避免使用{ {1}}和-a

尝试一下:

-o

==第一个版本==

if [[ ! -z "${ENV_VARIABLE}" && "${ENV_VARIABLE}" = true ]] ; then var1="${var2}"; else var1="${var3}"; fi

答案 4 :(得分:2)

同时使用默认值和备用值。

var1=${ENV_VARIABLE:+$var2} var1=${var1:-$var3}

$ var2=foo
$ var3=bar
$ var1=${ENV_VARIABLE:+$var2} var1=${var1:-$var3}
$ echo $var1
bar
$ 
$ var1=${HOME:+$var2} var1=${var1:-$var3}
$ echo $var1
foo