2010-12-27 17 views
93

GNU bash(バージョン4.0.35(1)-release(x86_64-suse-linux-gnu))を使用して、正規表現でテストを無効にしたいとします。たとえば、条件付きでPATHにパスを追加したい変数、のようにパスが、そこにまだない場合:私はこれを行うには百万の方法があると確信しているが、条件として、何とか否定できるのであれば私が知りたいのはあるbashスクリプトの正規表現でテストを否定するにはどうすればよいですか?

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 

おかげ

答えて

98

あなたはそれが正しい、ちょうどあなたがまたカッコ内の感嘆符を置くことができ![[if ! [[などの

+9

Oye vey!私が安全にperlの銀河間特有のキャラクターの狂気を回避したとき、私は自分自身がbashスペース(配置)で迷子になってしまった! (私はPythonのように私の腸を圧迫する恐れを感じる。)ありがとう! –

6

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

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

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

(Source)

+1

もう一つの理由(例えばに「/ binに」を追加しません"/ usr/bin"がすでに存在するため)。 –

+0

左のコロンが私に求めていたアンカーをどのようにしてくれたかを理解するのはしばらく時間がかかりました。検索対象の文字列にマテリアルを追加してパターンを縮小するという考え方は覚えておく価値があります。パス内の特殊文字がなぜ正規表現解を混乱させるのだろうが、なぜbashパターン解を混乱させるのか理解していない。あなたは私に例を挙げることができますか? –

+0

私はこれがすべてのケースで確実に動作するとは思わない。上のIMHOでの正規表現のマッチング –

80

の間にスペースを入れて持っていた:

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

偽陽性を減らすためにパターンを固定する必要があります:

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

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

+0

ああ、アンカーについての思い出に感謝します。小文字または混合変数名を使用するという考え方は、これまでbashの初心者に混乱させていました。私がこれまで見てきたアドバイスは、大文字を使用するためです。私はあなたが作っていることを理解していますが、料理の本を理解していなくても快適に使えるように、十分なbashスクリプトの例は見ていません。 –

+3

@anyoneisは私たちを信頼しています。ユーザー定義の大文字変数の使用は避けるべきです。 bashのすべての変数は '$'で展開されているので、大文字にする理由はありません。 – SiegeX

+0

私は 'if [[! $ foo =〜bar]] 'より安全な場合'! [[$ foo =〜bar]] '、' 'if''により多くの条件を導入しやすくするためです – CTodea

15

最も安全な方法は!このよう[[ ]]内の正規表現の否定のために:

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

それ以外の場合は、特定のシステムで失敗することがあります。

0

私はこのような場合には条件演算子を使用せずにコードを単純化したい:それは偶然のサブストリングと一致しないことがこのフォームにそれを使用するために

TEMP=/mnt/silo/bin 
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP 
関連する問題