如果未设置,则追加到类似PATH的变量而不创建前导冒号


10

我需要将目录附加到PKG_CONFIG_PATH。通常,我会使用标准

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig

PKG_CONFIG_PATH以前未在我的系统上设置过。因此,变量以一个:字符开头,该字符告诉该变量首先在当前目录中查找。我不要那个。我解决了以下问题,

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig

但这看起来太丑了。有没有更好的办法?当且仅当已设置变量时,有条件地附加冒号的适当方法是什么?


Answers:


13

您在使用${:+}扩展运算符的过程中走了正确的路,只需要对其稍作修改即可:

V=${V:+${V}:}new_V

第一个括号扩展到$V 而冒号iff V已经设置为其他内容,而这恰恰是您所需要的(可能也是操作符存在的原因之一)。

因此,在您的情况下:

export "PKG_CONFIG_PATH=${PKG_CONFIG_PATH:+${PKG_CONFIG_PATH}:}$(pyenv prefix)/lib/pkgconfig"

我使用的是表格,但我决定反对它,因为它(略)不易读:${V}${V:+:}Wvs ${V:+${V}:}W.。无论哪种方式,他们俩都感到非常丑陋。我希望有什么...更优雅,我猜呢?
scottbb 2014年

@scottbb-这是语法形式-它是如何完成的。如果要根据条件设置变量的值,则必须进行测试。您可以按照此处编写的内容进行内联测试,也可以显式地进行测试test- 您可以通过一种方式测试值并两次写入varname,但是通过这种方式,您可以在一条执行语句中进行操作-这样便很实用,但我从未遇到过优雅的计算机。
mikeserv

@scottbb认为确实如此。但是,恐怕您将无法获得更好的结果,因为您基本上需要先在条件中然后在扩展中使用变量名-我认为没有一种shell构造可以仅在出现一次时执行此操作名称。
彼得2014年

@mikeserv-我可能应该比说我正在寻找更“优雅”的解决方案更为精确。我从来没有真正看到过将子串追加到PATH样式变量中的完成,并且感觉到好像在想一种更好的方法。以我的经验,当我有这种感觉时,通常会有更好的方法。那就是我应该说的。但是您的观点是正确的。感谢您的答复。另外:在您对@peterph的注释的编辑之一中,您做出了这样的注释:我应该将整个参数都引用到export。这是一个很好的观点,我也对细节进行了嘲笑。
scottbb

@scottbb-很抱歉,如果我觉得这很讨厌-我从不了解关于计算的优雅概念。一台计算机就是一台机器-三路和/或闸门混合了数十亿次。它不能计数高于一个-在任何方面,它所做的每一件事都是蛮力的。一些直观的概念可能比其他一些概念更易于翻译,但是,如果这样的话,那只是因为该概念位于其他一些蛮力抽象之上。从本质上讲,计算永远不是高雅的事情。
mikeserv

1

最近,我在计算机上设置了GNU存放位置,以将用户范围的内容(例如库)存储在下面,~/.local并且在定义LD_LIBRARY_PATHCPATH和时遇到了麻烦,并且LIBRARY_PATH无意间在其中放置了一个冒号,从而破坏了内容。

然后我发现你的问题,得到的答案是不完全优雅 ;-),我写了一个小功能来处理这个问题,请在这里找到:https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a

## Copyright (C) 2018 Alex Thiessen <alex.thiessen.de+github@gmail.com>
## Copyright (C) 2018 https://unix.stackexchange.com/users/116858/kusalananda
## SPDX-License-Identifier: GPL-2.0-or-later
## <https://spdx.org/licenses/GPL-2.0-or-later.html>

function join() {
    if [ ${#} -eq 0 ]
    then
        echo "\`join\` appends elements separated by colons to a \`bash\` variable " >&2
        echo "usage: join <variable> <element> [element ...]" >&2
        return 1
    fi
    variable="${1}"

    shift
    export ${variable}="${!variable:+${!variable}:}$(IFS=:; echo "${*}")"
}

//根据@Kusalananda的建议进行编辑


另外:( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
库萨兰达

即:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
库萨兰达

...除了“ join”是一个不幸的名称之外,它也是标准实用程序的名称。
库萨兰达

不错,除了您会覆盖变量而不是附加到变量之外。只要${!variable:+${!variable}:}在正确的位置添加内容对我来说都是有效的,所有测试都通过了。找到一个合适的名字对读者来说是一种
艰辛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.