2017-08-04 113 views
-1

我正在编写一个bash脚本,它需要检查环境变量是否存在,并将其设置为运行脚本的父目录,如果变量isn已经设置好了。如果它已经设置,它应该什么也不做。这样做的最好方法是什么?设置环境变量为父目录(如果尚未设置)

回答

3

有两部分。首先,当前工作目录的父目录只是$PWD/..。其次,你可以,如果它尚未与

: ${MYVAR:=$PWD/..} 

第一:是什么也不做的指令集,但它的参数仍评估值赋给变量。参数展开运算符:=具有将MYVAR设置为给定值(如果尚未设置)的副作用。

+0

为什么不使用'$ {MYVAR:= $ {PWD%/ *}}'? –

+0

你可能会在这里。但是,一般来说,删除最后一个'/'及其后面的所有内容并不一定会删除最后一个路径组件。考虑一个具有尾部'/'的路径,例如'/ home/me /'。你的建议会产生'/ home/me'。 – chepner

+0

':$ {MYVAR:= $(dirname“$ PWD”)}',正如@LjmDullaart指出的那样,将是另一种选择;我想避免在可能的情况下运行其他进程。 – chepner

0

三件事:

环境变量是全球可用的,在程序和它的子程序。 shell变量仅在当前shell中可用。您询问是否存在环境变量。你确定这是你想要的吗?在这种情况下,你可能想要做一个

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 

三,父目录一般是dirname $PWD$PWD/..也是父目录。

所以,如果你不在乎它是否是一个环境变量或没有,如果你只是希望它包含一个实际的目录,代码将是这样的:

if [ "$variable" = "" ] ; then 
    variable=$(dirname "$PWD") 
fi 

(这是也许更可读Chepner的答案)

+0

清除'set'的输出并不可靠。另一个变量的值可能包含您在换行符后检查的字符串。假设你有'foo = $'bar \ nbaz ='';当你的支票真的只是'foo'的值的一部分时,你会看到'baz'是一个名字。 – chepner