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

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

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



답변

if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi


답변

로부터 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


답변

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

 


답변

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

[ -e "$VAR" ]

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

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

맨 페이지에서 :

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

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하는 것은 비효율적 인 것처럼 보이지만 작동합니다 …


답변