bash 스크립트의 논리 AND


10

나는이 if중 하나 2 개 파일로 존재하는 경우 그들이 그것을 일치 에코해야 존재하지 않는 경우, 확인하는 내 bash는 스크립트.

내가 가진 코드 :

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

그러나 이것은 어떤 이유로 작동하지 않는 것 같습니다.

이 두 파일이 존재하지 않는다고 110 % 확신합니다. 오류가 발생하지 않습니다. 입력하지 않습니다 if.

스크립팅을 처음 사용하므로 무엇이 잘못 될지 잘 모르겠습니다.


게시 된 답변 중 실제로 질문에 대한 답변은 없다고 생각합니다. 테스트를 개별적으로 시도하면 어떻게됩니까? 수행 [[ ! -f /etc/.../... ]]; echo $?각각.
jw013

경고 : [[ -f xxx ]]xxx가 존재 하고 일반 파일 (또는 일반 파일에 대한 심볼릭 링크) 이면 true를 반환합니다 . 존재하지 않거나 존재하는지 여부를 알 수 없지만 일반 파일 (디렉토리, 파이프, 장치, 소켓 ...)이 아니거나 심볼릭 링크가 아닌 경우 false를 반환합니다. 존재하지 않는 파일인지 또는 존재하지 않는지 또는 일반 파일이 아닌지를 알 수없는 파일에 [[ -e $file ]] || [[ -L $file ]]대해서는 존재 테스트에 더 가깝습니다. ls -d -- "$file" > /dev/null 2>&1더 가깝습니다. 그리고 원칙적으로 이런 종류의 테스트는 경쟁 조건으로 이어집니다. 다른 방법이있을 수도 있습니다.
Stéphane Chazelas

답변:


12

당신이 원하는 경우 중 하나를 당신은 싶어 OR하지 AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • 둘 중 하나 또는 둘 다 누락 된 경우 일치합니다.
  • 둘 다 존재하지 않는 match경우 에만 코드가 인쇄 됩니다 .

그러나 당신은 말했다 :

이 두 파일이 존재하지 않는다고 110 % 확신합니다. 오류가 발생하지 않으며 if를 입력하지 않습니다.

그래서 당신의 진술은 모순됩니다. 해당 코드를 실행중인 경우 해당 파일 중 하나 이상 존재 해야 합니다 .

if명령문 평가 방법을 보려면을 사용하여 실행하십시오 -x.

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

그런 다음 실행이 표시됩니다.

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

파일이 없으면 "일치"를 에코하고 싶습니다. 파일이 없으면 일치하지 않습니다. 나는 -x 그것을 시도 할 것이다
Peppercat101

이 경우 원래 코드는 양호해야합니다. 그리고 실제로 그것은 나를 위해 작동합니다.
bahamat

3

그럴까요? A는 파일이거나 B는 파일이고 blabla입니다.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

3

이것은 또한 당신이하려는 일에 효과적 일 수 있습니다. 단일 괄호는 오늘날 bash에서 일반적으로 사용되지 않지만 여전히 옵션입니다. '-o'를 사용하는 것은 사실상 "OR"연산이며 "!" 조건을 무효화합니다.

var=/etc/benchmarking/code
[ ! -f ${var} -o -f {var}.class ] && echo "match"

지금까지 사용하지 마십시오 [에서 bash. 그 외에도, 이것이 어떻게 질문에 대답하는지 알 수 없습니다.
jw013

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"그것은해야한다. 퀘스트는 : (둘 다) 존재하지 않는 경우 echo match.
hschou

0

코드가 요구 사항을 충족합니다 match. 파일을 찾을 수 없으면 인쇄 됩니다.

따라서 match다른 곳에서 인쇄되지 않는 이유 가 있습니다. 코드 블록에 도달하고 있는지 확인해야합니다. 코드 블록을 두 개의 디버그 메시지로 둘러 쌉니다. 예를 들면 다음과 같습니다.

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

필자의 일반적인 선호 사항은 stdout으로 의 데이터 흐름을 방해하지 않도록 메시지를 stderr 로 디버깅하는 것입니다 .하지만 초보자라고 말했기 때문에 여기서는 피했습니다. 다음은 stdout에 쓰는 방법을 보여주는 한 가지 예입니다 .

echo '@ About to enter if...fi block' >&2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.