【问题标题】:Set environment variable to parent directory if not already set如果尚未设置,请将环境变量设置为父目录
【发布时间】:2017-08-04 17:22:23
【问题描述】:

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

【问题讨论】:

    标签: linux bash environment-variables


    【解决方案1】:

    有两个部分。首先,当前工作目录的父级只是$PWD/..。其次,您可以为尚未设置的变量赋值

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

    第一个: 是什么都不做的命令,但它的参数仍然被计算。参数扩展运算符:= 具有将MYVAR 设置为给定值(如果尚未设置)的副作用。

    【讨论】:

    • 你为什么不用${MYVAR:=${PWD%/*}}?
    • 你可能在这里。不过,一般来说,删除最后一个 / 及其后面的任何内容并不一定会删除最后一个路径组件。考虑一个有尾随/ 的路径,例如/home/me/。你的建议会产生/home/me。
    • : ${MYVAR:=$(dirname "$PWD")},正如@LjmDullaart 所指出的,将是另一种选择;我喜欢尽可能避免运行其他进程。
    【解决方案2】:

    三件事:

    环境变量是全局可用的,在程序及其子程序中。 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 的答案更具可读性)

    【讨论】:

    • Grepping set 的输出不可靠。另一个变量的值可能包含您在换行符后检查的字符串。假设你有foo=$'bar\nbaz=';您的支票会将baz 视为一个名称,而它实际上只是foo 值的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多