如果在单行中设置了环境变量,则bash为变量赋值

如果在单行中设置了环境变量,则bash为变量赋值,bash,Bash,如何根据环境变量的设置将变量值设置为某个值 例如,我希望它是 var1 = var2 if ENV_VARIABLE==true else var3 (为了简单起见,使用python语法) 我希望这也发生在一行中。在本例中,bash的正确语法是什么。处的指南很好,但未涵盖此案例 试试这个: [[ "$ENV_VARIABLE" == "true" ]] && var1="$var2" || var1="$var3" 试试这个: [[ "$ENV_VARIABL

如何根据环境变量的设置将变量值设置为某个值

例如,我希望它是

var1 = var2 if ENV_VARIABLE==true else var3
(为了简单起见,使用python语法)

我希望这也发生在一行中。在本例中,bash的正确语法是什么。处的指南很好,但未涵盖此案例

试试这个:

[[ "$ENV_VARIABLE" == "true" ]] && var1="$var2" || var1="$var3"        
试试这个:

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

这可以移植到ur-
sh
,从技术上讲,可以放在一条线上

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

这可以移植到ur-
sh
,从技术上讲,可以放在一条线上

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

同时使用默认值和备用值

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


同时使用默认值和备用值

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

因此:

我们可以(最好不删除尾随换行):

或者(假设
ENV_变量
仅为字符串“true”或字符串“false”):

或(删除尾随的换行符)

或(删除尾随的换行符)

或者(删除尾随的换行符,eval是邪恶的)

或者(eval是邪恶的)

或者(eval是邪恶的)

或(删除尾随的换行符)

或者(疯狂)

或(命名的引用变量,因此不是真正的赋值,更多的是指针)

吹嘘,没有想法。我认为只有第一个才是正确的。我有时在脚本中使用布尔变量作为
true
false
字符串,这只允许删除
[…=true]
部分

因此:

我们可以(最好不删除尾随换行):

或者(假设
ENV_变量
仅为字符串“true”或字符串“false”):

或(删除尾随的换行符)

或(删除尾随的换行符)

或者(删除尾随的换行符,eval是邪恶的)

或者(eval是邪恶的)

或者(eval是邪恶的)

或(删除尾随的换行符)

或者(疯狂)

或(命名的引用变量,因此不是真正的赋值,更多的是指针)


吹嘘,没有想法。我认为只有第一个才是正确的。我有时在脚本中使用布尔变量作为
true
false
字符串,这只允许删除
[…=true]
部分。

如果
语句可以写在一行上

case $ENV_VARIABLE in true) var1=var2;; *) var1=var3;; esac
-z
可用于测试变量是否已定义且具有值

-测试中的a
,表示

==编辑==

if [ ! -z "${ENV_VARIABLE}" -a "${ENV_VARIABLE}" = true ] ; then var1="${var2}"; else var1="${var3}"; fi
(参见@tripleee的备注:第一个版本包含一个不可靠的
-a
。我没有发现建议的第一个版本存在问题,但避免使用
-a
-o
)似乎是一个很好的做法。)

试一试:

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

==第一个版本==

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

if
语句可以写在一行上

case $ENV_VARIABLE in true) var1=var2;; *) var1=var3;; esac
-z
可用于测试变量是否已定义且具有值

-测试中的a
,表示

==编辑==

if [ ! -z "${ENV_VARIABLE}" -a "${ENV_VARIABLE}" = true ] ; then var1="${var2}"; else var1="${var3}"; fi
(参见@tripleee的备注:第一个版本包含一个不可靠的
-a
。我没有发现建议的第一个版本存在问题,但避免使用
-a
-o
)似乎是一个很好的做法。)

试一试:

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

==第一个版本==

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

单行命令有什么特别之处?在makefile和gitlab ci config(针对我的特定用例)等其他地方很容易使用。在shell脚本(而不是Python)中,您认为什么构成了
true
?是字符串
t
r
u
e
,还是值
1
,或者不是空字符串的任何东西,或者……什么?如果ENV_VARIABLE==true,则
的一个或多或少的文字音译是
如果[“$ENV_VARIABLE”=“true”]
;还有许多其他的可能性。单行命令有什么特别之处?在makefile和gitlab ci config(针对我的特定用例)等其他地方很容易使用。在shell脚本(而不是Python)中,您认为什么构成了
true
?是字符串
t
r
u
e
,还是值
1
,或者不是空字符串的任何东西,或者……什么?如果ENV_VARIABLE==true,则
的一个或多或少的文字音译是
如果[“$ENV_VARIABLE”=“true”]
;还有很多其他的可能性。为什么数字比较(
-eq
用于shell中的数字;它用于Perl中的字符串)与非数字值
true
?或者,
[[
特例也是这样吗?它是真的,更好==对于字符串,使用非数值
真的
[[
特殊情况也是这样吗?没错,对于Strings,better==许多这样的情况都很可怕,应该有更详细和明确的警告。第一个(
如果
/
那么
/
否则
)备选方案可能是最整洁的。我可能会引用作业右侧的变量。其余的都是令人印象深刻的备选方案,但与第一个相比,它们都应该不用。@JonathanLeffler我通常在作业中引用,但作业中不执行分词,所以你可以不加引号就离开。其中许多都很可怕,应该附带更详细、更明确的警告。第一个(
如果
/
,那么
/
否则
)备选方案可能是最整洁的。我可能会引用作业右侧的变量。其余的都是令人印象深刻的备选方案,但与第一个相比,它们都应该不用。@JonathanLeffler我通常在作业中引用,但作业中不执行分词,所以你可以逍遥法外
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")
if [[ ! -z "${ENV_VARIABLE}" && "${ENV_VARIABLE}" = true ]] ; then var1="${var2}"; else var1="${var3}"; fi
if [ ! -z "${ENV_VARIABLE}" -a "${ENV_VARIABLE}" = true ] ; then var1="${var2}"; else var1="${var3}"; fi