programing

bash 스크립트에서 정규 표현을 사용하여 테스트를 부정하려면 어떻게 해야 합니까?

iphone6s 2023. 4. 17. 21:32
반응형

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

이를 위한 방법은 수백만 가지가 있겠지만, 제가 알고 싶은 것은 (오류)와 같이 어떤 식으로든 조건이 부정될 수 있는지 여부입니다.

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

옳았어, 그냥 띄어쓰기만 하면 돼!및 그[[맘에 들다if ! [[

괄호 안에 느낌표를 넣을 수도 있습니다.

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

단, false positive를 줄이기 위해 패턴을 고정해야 합니다.

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

시작 또는 끝에 콜론을 붙이고(또는 둘 다) 일치하는 항목을 찾습니다.셸 변수와 이름이 충돌할 가능성을 줄이기 위해 소문자 또는 대소문자 혼합 변수 이름을 사용하는 것이 좋습니다.

가장 안전한 방법은 !를 regex 부정으로 삽입하는 것입니다.[[ ]]다음과 같습니다.

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

그렇지 않으면 특정 시스템에서 실패할 수 있습니다.

네, SieveX가 이미 지적한 바와 같이 테스트를 무효로 할 수 있습니다.

그러나 이 경우 정규식을 사용하면 안 됩니다. 경로에 특수 문자가 포함되어 있으면 실패할 수 있습니다.대신 다음을 시도해 보십시오.

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

(출처)

이러한 경우 조건부 연산자를 사용하지 않고 코드를 단순화할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/4542732/how-do-i-negate-a-test-with-regular-expressions-in-a-bash-script

반응형