【发布时间】:2017-08-04 17:22:23
【问题描述】:
我正在编写一个 bash 脚本,它需要检查环境变量是否存在,如果尚未设置变量,则将其设置为运行脚本的父目录。如果它已经设置,它应该什么都不做。这样做的最佳方法是什么?
【问题讨论】:
标签: linux bash environment-variables
我正在编写一个 bash 脚本,它需要检查环境变量是否存在,如果尚未设置变量,则将其设置为运行脚本的父目录。如果它已经设置,它应该什么都不做。这样做的最佳方法是什么?
【问题讨论】:
标签: linux bash environment-variables
有两个部分。首先,当前工作目录的父级只是$PWD/..。其次,您可以为尚未设置的变量赋值
: ${MYVAR:=$PWD/..}
第一个: 是什么都不做的命令,但它的参数仍然被计算。参数扩展运算符:= 具有将MYVAR 设置为给定值(如果尚未设置)的副作用。
【讨论】:
${MYVAR:=${PWD%/*}}?
/ 及其后面的任何内容并不一定会删除最后一个路径组件。考虑一个有尾随/ 的路径,例如/home/me/。你的建议会产生/home/me。
: ${MYVAR:=$(dirname "$PWD")},正如@LjmDullaart 所指出的,将是另一种选择;我喜欢尽可能避免运行其他进程。
三件事:
环境变量是全局可用的,在程序及其子程序中。 shell 变量仅在当前 shell 中可用。您要求知道 environment 变量是否存在。你确定那是你想要的吗?在这种情况下,您可能想要做一个
if set | grep ^variable_name= > /dev/null ; then
#set the variable
fi
请注意,这只是检查变量是否存在。如果您很早就在脚本中执行此操作,您几乎可以确定该变量确实是一个环境变量。但是您真的关心它是特定于本地 shell 的变量还是环境变量?
其次,你关心变量是否存在吗?或者您只是希望它包含父目录的值?您是否需要上面示例中的 set | grep ,还是足以测试 [ "$variable" != "" ] ? ,如
if [ "$variable" = "" ] ; then
# set the value to the parent-dir
fi
第三,parent-dir一般为dirname $PWD。 $PWD/.. 也是父目录。
所以,如果你不关心它是否是一个环境变量,而你只是希望它包含一个实际的目录,那么代码应该是这样的:
if [ "$variable" = "" ] ; then
variable=$(dirname "$PWD")
fi
(这可能是 Chepner 的答案更具可读性)
【讨论】:
set 的输出不可靠。另一个变量的值可能包含您在换行符后检查的字符串。假设你有foo=$'bar\nbaz=';您的支票会将baz 视为一个名称,而它实际上只是foo 值的一部分。