web-dev-qa-db-ja.com

bashスクリプトの正規表現でテストを無効にするにはどうすればよいですか?

GNU bash(バージョン4.0.35(1)-release(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

これを行う方法は100万通りあると確信していますが、知りたいのは、(誤った)のように、条件を何らかの形で否定できるかどうかです:

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
142
David Rogers

![[の間にスペースを入れるだけで、if ! [[のようになりました

154
SiegeX

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

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

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

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

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

107

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

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

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

17

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

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

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

(ソース)

7
Mark Byers

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

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
4
dimir