設定されていない場合、先行コロンを作成せずに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

しかし、それはとても醜いようです。もっと良い方法はありますか?変数がすでに設定されている場合にのみ、条件付きでコロンを追加する適切な方法は何ですか?


回答:


13

あなたは${:+}展開演算子で正しい軌道に乗っています、あなたはそれをわずかに変更する必要があります:

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

最初のブレースが展開さ$V 、コロンのiff Vはすでにそれ以外の場合は何も設定されていません-これはまさに必要なものです(そしておそらく演算子が存在する理由の1つでもあります)。

したがって、あなたの場合:

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

私は、そのフォームを使用していたが、それは(わずかに)読みにくく感じたので、私はそれに対して決定:${V}${V:+:}W対を${V:+${V}:}W。どちらにしても、どちらも本当に醜い感じがします。もっとエレガントなものを期待していましたね。
scottbb 2014年

@scottbb-これは構文形式です-方法です。条件に基づいて変数の値を設定する場合は、テストを行う必要があります。ここに記述されているようにインラインテストを実行するか、またはtest値をテストしてvarnameを2回書き込むいずれかの方法で明示的にテストできますが、この方法では、1つの実行ステートメントでそれを実行します-その方法は実用的です、しかし私はエレガントなコンピューターに会ったことがありません。
mikeserv 2014年

@scottbb考えてみると本当に同じです。ただし、基本的には条件とその後の展開で変数名が必要になるため、これ以上改善することはできないと思います。1回の出現でそれを実行するシェルコンストラクトはないと思います名前。
peterph 2014年

@mikeserv-私はおそらく、より「エレガントな」ソリューションを探していたと言うよりも、もっと正確だったはずです。PATHスタイルの変数に部分文字列を追加するためにこれが実際に行われるのを実際に見たことがありません。私の経験では、そのような気持ちになったときに、通常はもっと良い方法があります。それは私が言うべきだったのです。しかし、あなたの主張はよく理解されています。お返事をありがとうございます。また、@ peterphのコメントの編集の1つで、引数全体を引用する必要があるとコメントしましたexport。それは非常に良い点です、私はその詳細も微笑しました。
scottbb 2014年

@scottbb-それが研磨剤として外れた場合は申し訳ありません- コンピューティングに関するエレガンスの概念を理解したことはありません。コンピュータは機械であり、3ウェイやゲートが数十億回も複合化しています。1を超える数をカウントすることはできませ。あらゆる点で、実行するすべてのことはブルートフォースです。直感的な概念の中には、他の概念よりも翻訳が簡単なものもありますが、そうだとすれば、それは、その概念が他のブルートフォースによる抽象化の上にあるからです。コンピューティングは、本質的に、常にエレガントではありません。
mikeserv 2014年

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 "$*" )
クサラナンダ

Ie:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
Kusalananda

...ただし、 "join"は、標準ユーティリティの名前でもあるため、残念な名前です。
クサラナンダ

変数に追加するのではなく、変数を上書きするという事実を除いて、素晴らしいものです。${!variable:+${!variable}:}適切な場所に追加するだけでうまくいき、すべてのテストに合格しました。適切な名前を見つけることは読者
にとって非常に重要です
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.