如果在单行中设置了环境变量,则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