배쉬 조건들 : 어떻게 표현을 "그리고"하는가? ([! -z $ VAR && -e $ VAR] 인 경우)


281

"and"테스트를 수행하는 방법에 대해 잘 모르겠습니다. 나는 잘 작동하는 인수가 있는지 확인하고 싶었지만 [ -e $VAR ]빈 문자열에서도 true로 평가되고 있음이 밝혀졌습니다. 내가 원하지 않는

어떻게 '그리고'그들을 함께합니까? 아니면 내가 원하는 것을 성취하는 또 다른 단항 테스트가 있습니까?

답변:



70

로부터 bash맨 :

[[ expression ]] -조건식의 평가에 따라 0 또는 1의 상태를 반환합니다.

그리고 표현식의 경우 옵션 중 하나는 다음과 같습니다.

expression1 && expression2- 두 경우는 true expression1와는 expression2사실이다.

따라서 and다음과 같이 함께 사용할 수 있습니다 ( -n반대 -z의 경우 !).

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

그러나이 경우에는 필요하다고 생각하지 않습니다 -e xyzzy. xyzzy 파일 이 존재하고 빈 문자열을 쉽게 처리 할 수 있다면 사실 입니다. 그것이 원하는 것이라면 실제로 -z비어 있지 않은 검사 가 필요하지 않습니다 .

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

즉, 다음을 사용하십시오.

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi

1
우리는 그것을 [[ -e "$var" ]] && echo "'$var' exists"
줄여서

1
예, 하나의 라이너 인 경우 (내 예와 같이). 조건부 블록이 훨씬 더 복잡하다면 그렇게하지 않을 것입니다.
paxdiablo 2018 년

경우에 하나가 - 어쩌면 긴 하나 - 명령, 그것은 짧은으로이 양식을 사용하는 것이 합리적
AVP

9
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

 


10
이후 POSIX의 동작을 정의하지 않는 [테스트 공단과를, 우리는 사용하지 않아야 -a또는 -o함께 [. 나는 그것을 여기에서 읽었다 .
jaypal 싱

2
@ jaypal-singh 당신 말이 맞지만, 주제에는 bashPOSIX에 대한 언급이 없으며,이 버전은 bash다른 현대적인 쉘 에서 작동합니다 .
Slava Semushin 님이

2
당신이 bash또는 다른 현대 쉘을 사용한다고 가정한다면, 추천 할 이유 가 훨씬 적습니다-a .
chepner

bash를 사용하더라도 이러한 테스트의 동작 방식은 모든 경우에 잘 정의되어 있지 않습니다. 고려하십시오 [ "$var1" -o "$var2" ]; 경우 var1=(var2=), 그 다음 우리가해야하는 것은 여부에 대한 테스트입니다 -o중 하나 오히려 여부보다, 비 비어 var1또는 var2비 비어 있습니다. 이러한 종류의 모호성은 정확한 인용 부호를 가진 x$var현대 (90 년대 이후) test명령 의 관용구에 대한 유일한 합법적 인 이유이며, 관용구 는 화재로 죽어야합니다.
찰스 더피

4

변수를 간단히 인용하십시오.

[ -e "$VAR" ]

비어 [ -e "" ]있으면 평가됩니다 $VAR.

버전이 (으)로 평가되어 작동하지 않습니다 [ -e ]. 이 경우, bash는 단일 인수 ( -e)가 비어 있지 않은 문자열 인지 간단히 확인 합니다.

맨 페이지에서 :

인수 수에 따라 규칙 집합을 사용하여 조건식을 테스트하고 평가합니다. ...

1 논쟁

인수가 널이 아닌 경우에만 표현식이 참입니다.

(또한이 솔루션에는 공백이 포함 된 파일 이름으로 작업 할 경우 추가 이점이 있습니다)


1

지금 답을 찾았습니다. 제안 해 주셔서 감사합니다!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

그것에 대한 의견이 있으십니까? 두 번 grep하는 것은 비효율적 인 것처럼 보이지만 작동합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.