Bash 스크립트의 논리 AND

Bash 스크립트의 논리 AND

내 bash 스크립트 중 하나는 if이 두 파일 중 하나가 존재하는지 확인해야 하며, 존재하지 않으면 일치 항목을 다시 표시해야 합니다.

코드가 있습니다.

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

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

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

저는 bash 스크립팅을 처음 접했기 때문에 무엇이 잘못될 수 있는지 잘 모르겠습니다.

답변1

네가 원한다면누구나글쎄요, 당신이 원하는 것은 OR아닙니다 AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • 하나 또는 두 파일이 모두 누락된 경우 일치합니다.
  • match귀하의 코드는 다음과 같은 경우에만 코드를 인쇄합니다.둘 다존재하지 않는다.

하지만, 당신은 이렇게 말합니다:

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

그래서 당신의 진술은 모순됩니다. 파일 중 적어도 하나~ 해야 하다존재하다,만약에당신은 달리고 있다저것암호.

if명령문이 어떻게 평가되는지 보려면 run it 을 사용하십시오 -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
$ 

답변2

이렇지 않아야합니까? 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"

답변4

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'

내가 일반적으로 선호하는 것은 디버그 메시지가표준 에러데이터 흐름이 중단되지 않도록표준 출력, 그런데 여기서는 당신이 초보자라고 했기 때문에 그것을 피했습니다. 다음은 작성 방법을 보여주는 예입니다.표준 에러:

echo '@ About to enter if...fi block' >&2

관련 정보