235

GNU bash(バージョン4.0.35(1)-リリース(x86_64-suse-linux-gnu))を使用して、正規表現を使用したテストを無効にします。たとえば、PATH変数にパスを条件付きで追加します。次のように、パスがまだ存在しない場合。

TEMP=/mnt/silo/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
export PATH

これを行う方法は無数にあると思いますが、私が知りたいのは、(誤った)のように、条件をなんらかの方法で無効にできるかどうかです。

TEMP=/mnt/silo/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
export PATH
4

5 に答える 5

270

あなたはそれを正しく持っていました、ちょうどなどの間にスペースを入れ![[くださいif ! [[

于 2010-12-28T00:00:12.717 に答える
162

角かっこ内に感嘆符を入れることもできます。

if [[ ! $PATH =~ $temp ]]

ただし、誤検知を減らすためにパターンを固定する必要があります。

temp=/mnt/silo/bin
pattern="(^|:)${temp}(:|$)"
if [[ ! "${PATH}" =~ ${pattern} ]]

これは、先頭または末尾のコロンで一致するものをその前後(または両方)で検索します。シェル変数との名前の衝突の可能性を減らすために、習慣として小文字または大文字と小文字が混在する変数名を使用することをお勧めします。

于 2010-12-28T02:17:06.613 に答える
25

最も安全な方法は!次のような正規表現の否定の場合[[ ]]

if [[ ! ${STR} =~ YOUR_REGEX ]]; then

そうしないと、特定のシステムで失敗する可能性があります。

于 2011-10-21T07:32:38.613 に答える
10

はい、SiegeXがすでに指摘しているように、テストを無効にすることができます。

ただし、これには正規表現を使用しないでください。パスに特殊文字が含まれていると失敗する可能性があります。代わりにこれを試してください:

[[ ":$PATH:" != *":$1:"* ]]

(ソース)

于 2010-12-28T00:00:10.420 に答える
7

このような場合、条件演算子を使用せずにコードを単純化するのが好きです。

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
于 2017-10-04T09:00:52.323 に答える